2017-01-09 4 views
0

Je sais que le typecript a un mécanisme de typage structurel. Je me attends cependant, que si vous avez une classe comme ceci:La classe typée readonly typée ne se heurte pas à la classe typographique régulière si la structure est la même

et celui défini comme ceci:

class ReadonlyCountry { 
    readonly id: string; 
    readonly name: string;  
} 

que le système de frappe montrerait des collisions si vous retournez un objet avec le type ReadonlyCountry dans une fonction qui a comme type de retour Country. Il semble que ce ne soit pas le cas comme dans l'exemple typescript playground montré ci-dessous.

class Country { 
 
    id: string; 
 
    name: string; 
 
} 
 

 
class ReadonlyCountry { 
 
    readonly id: string; 
 
    readonly name: string;  
 
} 
 

 
function select(value: string): ReadonlyCountry[] { 
 
    let country = new Country(); 
 
    country.id = "1"; 
 
    country.name = "name"; 
 
    return [country]; 
 
} 
 

 
function select2(value: string): Country[] { 
 
    // the type of the return here will be ReadonlyCountry[] 
 
    // the type of the function return here is Country[] 
 
    // why doesn't this collide? 
 
    return select(value); 
 
}

Donc ma question est, comment puis-je faire en sorte qu'un type qui a des propriétés en lecture seule et un type qui ne possède pas les types readOnly et qui sont structurellement les mêmes, les erreurs de type show quand il est mélangé? Ai-je manqué quelque chose de stupide ici et est-ce juste le typage structurel qui provoque cela?

Toute aide serait appréciée.

Répondre

0

Oui, c'est un typage structurel qui cause vos problèmes. Je pense que vous devriez reconsidérer la structure de vos classes et essayer d'éviter celles avec une structure identique qui doit être traitée différemment.

En note. Au lieu de créer les versions en lecture seule des mêmes classes (duplication ainsi votre code et introduire des problèmes de maintenance) pourquoi ne pas utiliser les types cartographiés (see here), et plus précisément Readonly un déjà prédéfini pour vous:

function select(value: string): Readonly<Country>[] 

Hope this aide.

+0

Je connais le type mappé en lecture seule et j'ai l'intention de l'utiliser. Ceci est cependant un peu un problème pour moi. J'utilise Redux et je veux que l'état provienne de mon magasin en lecture seule. Cela signifie avoir un objet qui a la même apparence sans les propriétés reaonly (celles qui vont dans mon magasin) et la variante reaonly (celle qui sort de mon magasin). J'ai peur qu'il soit impossible cependant .... – KwintenP

+0

Je pense que vous devriez aller avec Readonly, et si vous voulez - assurer readonly à l'exécution aussi en les congelant immédiatement après les avoir reçus du magasin (http: //www.2ality .com/2013/08/protection-objects.html). – Amid

+0

Readonly corrige mon problème si je le définis partout. Mais si quelqu'un oublie de le définir correctement, je voudrais que le tapuscrit le prenne. Si ce n'est pas le cas (comme ci-dessus dans mon exemple), je suis sûr que les développeurs vont le faire quelque part. J'utilise déjà une bibliothèque de congélation pour effectuer des vérifications d'exécution, mais j'aimerais l'avoir au moment de la compilation. – KwintenP