2014-07-25 12 views
6

mam dwie klasy, które dziedziczą z tej samej klasy bazowej:Jak dołączyć dwie tablice z typami dwóch różnych typów, które rozszerzają/dziedziczą ten sam typ?

class Vehicle {} 

class Bus extends Vehicle {} 

class Truck extends Vehicle {} 

zjedzmy dwie tablice wpisane:

var buses : Bus[]; 
var trucks : Truck[]; 

i funkcję, która przyjmuje tablicę nadklasy typu.

function checkOil(vehicles : Vehicle[]) {} 

mogę przekazać w tablicy autobusów lub tablicy ciężarówek, ale nie mogę ich połączyć i przekazać je razem:

function checkOil(buses.concat(trucks)); 


//error TS2082: Supplied parameters do not match any signature of call target: 
    Types of property 'pop' of types 'Bus[]' and 'Track[]' are incompatible: 

Jak mogę połączyć te tablice?

Edycja: TypeScript Playground

+0

mógł je skopiować zarówno w wystarczająco dużej tablicy "Pojazdu". Dlaczego chcesz to zrobić? – dfeuer

+1

Concat to array of Vehicle nie zadziała. Kopiuj za pomocą pętli for, ale to jest suboptymalne, dlatego szukam lepszego rozwiązania tutaj. –

Odpowiedz

5

odlewnicza do <Vehicle[]> powinien działać

function checkOil(vehicles : Vehicle[]) {} 

checkOil((<Vehicle[]>buses).concat(trucks)); 

Typescript będzie rzucać (busses) do Vehicle[], a tym samym będą wykonane z reszta

np to powróci (w konsoli) dwóch obiektów - Pojazdy

class Vehicle 
{ 
    public Type: string; 
} 
class Bus extends Vehicle 
{ 
    public A: string; 
} 
class Truck extends Vehicle 
{ 
    public B: number 
} 

var buses: Bus[] = []; 
buses.push({Type: 'Bus', A : 'A1'}); 
var trucks: Truck[] = []; 
trucks.push({ Type: 'Truck', B: 1 }); 

function checkOil(vehicles: Vehicle[]) : Vehicle[] 
{ 
    return vehicles; 
} 
var result = checkOil((<Vehicle[]>buses).concat(trucks)); 
console.log(result) 
+0

Nie, to zwraca ten sam błąd. –

+0

Cóż, powyższy fragment kodu działa ... czy brakuje mi części twojego pytania? –

+0

Jeśli używasz * faktycznie * pustych klas, zasadniczo nigdy nie otrzymasz błędów. Używanie typów pustych do eksperymentowania z systemem typu strukturalnego jest receptą na złe wyniki. –

2

Wystarczy wpisać dochodzić pierwszą tablicę do wspólnego typu typów dwa tablicy:

checkOil((<Vehicle[]>buses).concat(trucks)); 
+0

Dzięki za komentarz, masz rację. The Assert to sposób, w jaki –

+0

Przepraszam, ale to działa, o ile podpisy klas są puste. Dodaj metodę i pojawi się ten sam błąd: http://goo.gl/ThDuMk –

+0

Te nawiasy sprawiły różnicę :). Dzięki –

Powiązane problemy