2016-09-18 6 views

Répondre

6

Compatibilité Type dactylographiée est basé sur structurel sous-typage, pas typage nominal. Cela dit, tenez compte des deux définitions d'interface suivantes:

interface IFoo { X: number } 
interface IBar { X: number; Y: number } 

Est-ce que IBarIFoo étendent? Mais est-ce que IFoo est compatible avec IBar? Oui.

Les membres de IFoo sont un sous-ensemble de IBar membres, vous pouvez ainsi assigner une IBar-IFoo. Mais cela ne fonctionne pas dans l'autre sens:

var x: IFoo; 
var y: IBar; 

x = y // all good 
y = x // type error, x has no Y member 

De cette façon dactylographiée tous les types sont compatibles avec Object si vous pensez que l'interface vide. De cette façon, vous pouvez passer n'importe quelle valeur tapuscrite valide aux fonctions acceptant Object et bien jouer avec la façon dont les librairies Javascript sont écrites.

Je suggère de lire Type Compatibility dans les docs et le dernier paragraphe à propos de Sous-type vs Affectation.

+1

Ok, c'est essentiellement l'explication que j'attendais (après avoir remarqué que je pouvais aussi assigner un bool à une interface vide que j'ai définie appelée Bool, qui est isomorphe à Object). Je comprends structurel contre nominal, mais ne m'attendais pas à ce qu'il s'applique aux types de non-référence. J'imagine que ce n'est que du son dans la mesure où Object a vraiment une interface vide (étant donné qu'il y a probablement des choses que je peux faire à un objet que je ne peux pas faire avec un nombre ou une chaîne primitive). – Roly

+0

Je suis content de l'explication, alors j'ai accepté la réponse. Il s'avère que je me suis fait mordre pas parce que le nombre Roly

+1

Je suppose que voici un sens dans lequel le nombre Roly