2013-04-18 13 views
5

Wydaje się, że byłoby bardzo użyteczne w TypeScript wymaganie, aby moduł implementował interfejs. Czy istnieje jakiś szczególny powód, dla którego zdecydowali się nie wdrażać tej umiejętności?Dlaczego moduły TypeScript nie mogą implementować interfejsu? Czy mogę to obejść?

Nie mogę wymyślić żadnego powodu, dla którego byłoby niepożądane, aby moduł mógł zaimplementować interfejs, ale jeśli tak, to czy istnieje inny sposób wymagający, aby moduł zapewniał pewien zestaw właściwości/metod?

+0

umieścić klasę w module, który implementuje interfejs, jesteś tylko kropka od konieczności, co chcesz. – Fenton

+0

Byłoby to dla mnie niepożądane, ale pomyślałem o tym przed zadaniem tego pytania. Gdybym to zrobił, miałbym dodatkową niepotrzebną definicję i musiałbym również rozróżnić definicję typu i przypisania instancji. –

Odpowiedz

4

Można wymusić błąd kompilacji, jeśli moduł nie przywiera do interfejsu jak ten (technicznie niezerową napowietrznych wykonawczego, ale mało prawdopodobne, aby rzeczywiście sprawa):

interface foo { 
    bar(): number; 
} 

module mod { 
    export function bar(): number { 
     return 0; 
    } 
} 
var mod_is_foo: foo = mod; // errors if you change 'number' to 'string' above 

Jak, dlaczego nie może mówisz module mod implements foo? All features start at minus 100.

Edytuj, aby dodać - oto kilka innych (nieco zwariowanych) rzeczy można napisać zamiast rachunku var powyżej, jeśli chciał uniknąć tworzenia nowego najwyższego poziomu var:

<foo>mod; // Shortest, probably fastest? 
<foo>undefined === mod; // Clearest non-var version? 
+0

Dzięki za bezpośrednią informację zwrotną Ryan, ty i zespół robicie świetne rzeczy. Zacznę angażować się w obszar maszynopisu na codepleksie. –

+0

Tak naprawdę mogłem wykorzystać tę pracę, ale w nieco inny sposób. Budowałem komponenty, które miały być używane w układzie mediatora i "rejestrowałem" wszystkie komponenty w systemie podstawowym. Kiedy je rejestrowałem, przekazywałem rzeczywisty moduł do metody i właśnie zrobiłem tę metodę, akceptując tylko interfejs, który zawierał wszystko, co chciałem, aby moduły zapewniały. W ten sposób zapewniono, że moduły te są zgodne z interfejsem. Jeszcze raz dziękuję Ryan! –

+1

Od TypeScript 9.1 możesz użyć słowa kluczowego "typeof", aby rozwiązać ten problem: http://blogs.msdn.com/b/typescript/archive/2013/08/06/announcing-0-9-1.aspx – Dan

1

Ryan faktycznie w zespole Maszynopisów, więc jego odpowiedź jest prawie ostateczna. Ale osobiście uważam za dobre, że nie zapewnia składni, której szukasz.

Powodem jest to, że moduł jest bardziej podobny do instancji, niż do czegoś, co można utworzyć (np. Klasa). W ten sposób jest bliższy var niż klasie.

Więc powodem staje się, że jego podobna do dlaczego piszesz:

var x:foo; 

zamiast

var x implements foo; 

moduły zachowują się tak samo, że można zrobić

var y:foo = mod; 

jak Ryan wskazał już.

również sprawdzić to na zewnątrz:

interface foo { 
    bar(): number; 
} 

module mod { 
    export function bar(): number { 
     return 0; 
    } 
} 

var x: foo; 
x = mod; 

// Still a bit whacky but allowed as module is a type as well as an instance 
var y:mod; 
y = x; 
Powiązane problemy