Pourquoi void et {} ne peuvent-ils pas être déduits comme ne jamais taper en TypeScript ?
P粉548512637
2023-09-04 16:03:52
<p>J'obtiens des résultats différents lorsque j'utilise le type void de TypeScript avec des types croisés avec d'autres types. </p>
<pre class="brush:php;toolbar:false;">type A = void & {} // A est void &
tapez B = void & '1' // B n'est jamais
tapez C = void & 1 // C n'est jamais
tapez D = void & string // D n'est jamais
tapez E = void & String // E est void &
<pre class="brush:php;toolbar:false;">type A = void &
tapez E = vide &
<p>Ils devraient également être du type «jamais», n'est-ce pas ? </p>
{}
和String
都是对象类型,而string
和'1'
都是原始类型。你可以将void
Intersecte les types d'objets car les types d'objets se croisent en ajoutant des propriétés :En revanche, les types primitifs se croisent en réduisant l'ensemble des valeurs possibles :
Et en croisant un type primitif avec un type objet, vous pouvez ajouter de nouvelles propriétés au type primitif :
Mais un type primitif ne peut jamais être un autre type primitif. Par conséquent, l’intersection de deux types primitifs différents donnera
never
Enfin,
void
est un type primitif.Donc, cela signifie que
void & { foo: number }
signifie que le type primitifvoid & { foo: number }
意味着原始类型void
也将具有属性foo
aura également l'attributfoo
.Cependant,
void & string
produiravoid & string
将产生never
car ce sont deux types primitifs différents.Cependant,
void & String
estvoid & String
是void
加上String
的属性,因为String
是一个对象类型(通过new String()
plus les propriétés deString
carString
est un type d'objet (vianew String() créé).
Cependant, rien de tout cela n’a beaucoup de sens. Vous ne pouvez pas attribuer
void
分配除了undefined
之外的任何东西,而undefined
不能有属性。所以我认为在你的代码库中void & Type
autre chose queundéfini
, etundéfini
ne peut pas avoir d'attributs. Je pense donc quevoid & Type
n'a aucune raison d'exister dans votre base de code. Si vous pensez en avoir besoin, je vous demanderais pourquoi vous en avez besoin et j'essaierais de refactoriser le code pour qu'il n'en ait pas besoin.