2015-08-05 13 views
8

podczas korzystania maszynopis zadeklarowana interfejs mógłby wyglądać następująco:Jak zmniejszyć obiekt JavaScript, żeby zawierać tylko właściwości z interfejsem

interface MyInterface { 
    test: string; 
} 

i realizacja dodatkowo własności może być tak:

class MyTest implements MyInterface { 
    test: string; 
    newTest: string; 
} 

Przykład (tutaj zmienna "zredukowana" nadal zawiera właściwość "test nowej"):

var test: MyTest = {test: "hello", newTest: "world"} 

var reduced: MyInterface = test; // something clever is needed 

Pytanie

W sposób ogólny, jak można zrobić zmienną „” to tylko obniżoną zawierają właściwości zadeklarowane w interfejsie „MyInterface”.

Dlaczego

Problem występuje, gdy próbuje użyć „zmniejszona zawartość” zmienną angular.toJson przed wysłaniem go do serwisu reszta - metoda toJSON przekształca zmienną newTest, nawet jeśli nie jest dostępny na instancja podczas kompilacji, a to sprawia, że ​​usługa reszta nie akceptuje json, ponieważ ma właściwości, które nie powinny tam być.

Odpowiedz

0

Ewentualnie duplikat:

TypeScript or JavaScript type casting

Trzeba "cast" swoją wartość do innego typu.

kilka dobrych przykładów są również tutaj: http://blogs.microsoft.co.il/gilf/2013/01/18/using-casting-in-typescript/

this.span = <HTMLSpanElement>document.createElement('span'); 

nadzieję, że to pomogło?

+1

Nie, przepraszam, nie pomaga. I nie może zobaczyć, jak to może być duplikat. Dziękuję za odpowiedź :) –

+0

Jest to duplikat, ponieważ "zmniejszona" wartość, o której mówisz, nazywa się castingiem. –

+1

Cóż, problemem, jaki mam, nie jest to, jak obsadzić zmienną - działa dobrze. Problem polega na tym, że rzucana instancja nadal zawiera dodatkowe właściwości. Pytanie, które łączysz, nie dba o to i nie prosi o to. –

1

W przykładzie newTest nieruchomość nie będzie dostępna thru zmniejszona zmienną, więc to jest cel używania typy. Maszynopis przynosi sprawdzanie typu, ale nie manipuluje właściwościami obiektu.

+0

Naszym problemem jest to, że próbujemy użyć zmiennej "zredukowanej" przy pomocy angular.toJson przed wysłaniem jej do usługi odpoczynku - i toJson przekształca nawet zmienną newTest, nawet jeśli nie jest dostępna z instancji. –

1

Czy próbujesz ustawić/ustawić tylko właściwości wymienione w interfejsie? Funkcjonalność taka jak ta nie jest dostępna w TypeScript, ale bardzo łatwo jest napisać funkcję, aby wykonać zachowanie, którego szukasz.

interface IPerson { 
 
    name: string; 
 
} 
 

 
class Person implements IPerson { 
 
\t name: string = ''; 
 
} 
 
class Staff implements IPerson { 
 
\t name: string = ''; 
 
    position: string = ''; 
 
} 
 

 
var jimStaff: Staff = { 
 
    name: 'Jim', 
 
    position: 'Programmer' 
 
}; 
 

 
var jim: Person = new Person(); 
 
limitedAssign(jimStaff, jim); 
 
console.log(jim); 
 

 
function limitedAssign<T,S>(source: T, destination: S): void { 
 
    for (var prop in destination) { 
 
     if (source[prop] && destination.hasOwnProperty(prop)) { 
 
      destination[prop] = source[prop]; 
 
     } 
 
    } 
 
}

+1

To jest coś takiego, czego szukam. Nie mogę tego zmusić do działania. Wierzę, że dzieje się tak, ponieważ właściwości "jim" nie są inicjowane i nie znajdują żadnych właściwości, które można przełączyć. Również - jeśli byłby jakiś sposób na pominięcie klasy "Person" i po prostu przeglądanie właściwości bezpośrednio od IPersona - byłoby idealnie. –

+0

@ TomasF Miałem ten sam problem i odkryłem to. Zobacz https://github.com/Microsoft/TypeScript/issues/6515, ponieważ bazowy JS nie ma ustawionych domyślnych właściwości, więc pętla 'for' nie ma właściwości do iteracji. Rozwiązaniem jest dodanie wartości domyślnych do każdej właściwości, np. 'Name: string = '';' – ubershmekel

0

W sposób ogólny, jak można zrobić zmienną „” to tylko obniżoną zawierają właściwości zadeklarowane w interfejsie „MyInterface”.

Od maszynopis jest strukturalny oznacza to, że wszystko, co zawiera istotnych informacji jest typ Kompatybilny a zatem przypisywane.

Powiedziawszy to, TypeScript 1.6 otrzyma koncepcję o nazwie freshness.To sprawi, że łatwiej złapać jasne literówki (uwaga świeżość tylko odnosi się do obiektu literały):

// ERROR : `newText` does not exist on `MyInterface` 
var reduced: MyInterface = {test: "hello", newTest: "world"}; 
0

TS 2,1 rozprzestrzenił Object i odpocząć, więc jest to teraz możliwe:

var my: MyTest = {test: "hello", newTest: "world"} 

var { test, ...reduced } = my; 

Po to zmniejszone będzie zawierało wszystkie własności z wyjątkiem "testu".

+0

Czy mógłbyś wyjaśnić, co rozumiesz przez Object Spread and Rest? Masz na myśli potrójne kropki "... prawda? –

+0

Tak. Rozprzestrzenianie obiektów pozwala eksplodować właściwości, Odpoczynek, aby odciąć właściwości. –

Powiązane problemy