Comment comprendre l'intersection TypeScript via keyof
P粉451614834
2023-09-05 22:37:33
<p><pre class="brush:php;toolbar:false;">interface Personne {
nom : chaîne ;
}
Durée de vie de l'interface {
date de naissance;
date de mort;
}
tapez PersonSpan = Personne et durée de vie;
tapez K = clé de PersonSpan ; // tapez K = "nom" |
let prop : K = "nom" ; // ok
let obj : PersonSpan = { // erreur de compilation, propriétés de naissance et de décès manquantes
nom : "John Smith"
}</pré>
<p>Si je veux comprendre l'intersection de types via <code>keyof</code> : </p>
<p>La clé<code>{ name : "John Smith" }</code> de cette instance d'objet est <code>name</code>, qui correspond à la <code>keyof PersonSpan</code> , c'est-à-dire <code> "name" | "birth" | "death" </code>, il est valide d'exécuter <code>let prop: "name" |. "Naissance" | "Décès" = "Nom" </code></p>
<p>Donc, tant que l'objet possède l'une de ces trois propriétés, il doit être valide, pourquoi doit-il toujours avoir toutes les propriétés attribuables à <code>PersonSpan</code> ? </p>
Dans TypeScript, lorsque vous définissez un type en utilisant l'intersection & de deux types ou plus, le type résultant aura toutes les propriétés de chaque type d'intersection. Dans ce cas, PersonSpan est défini comme l'intersection de Person et Lifespan, donc un objet de type PersonSpan doit avoir toutes les propriétés de Person et Lifespan. Même si keyof PersonSpan donne "name" | "birth" | "death", cela ne signifie pas que tout objet avec une seule de ces propriétés est valide pour PersonSpan, cela signifie que le type K que vous avez initialisé est une combinaison de PersonSpan. noms de propriétés Set, vous pouvez accéder à ces propriétés en utilisant la clé "name" sur un objet de type PersonSpan, "birth" ou "death" qui peut également être le type Partial que vous recherchez, ce qui rend tous les accessoires facultatifs