TypeScript では void と {} を決して入力しないと推論できないのはなぜですか?
P粉548512637
2023-09-04 16:03:52
<p>TypeScript の void 型とクロス型を使用する他の型を使用すると、異なる結果が得られます。 </p>
<pre class="brush:php;toolbar:false;">type A = void & {} // A は void & {}
type B = void & '1' // B は決してありません
type C = void & 1 // C は決して存在しません
type D = void & string // D は決して存在しません
type E = void & String // E は void & String</pre>
<pre class="brush:php;toolbar:false;">type A = void & {}
type E = void & String</pre>
<p>それらは決して型ではないはずですよね? </p>
リーリー{}
とString
は両方ともオブジェクト型ですが、string
と'1'
はどちらもプリミティブ型です。オブジェクト タイプはプロパティを追加することで交差するため、void
とオブジェクト タイプを交差させることができます:対照的に、プリミティブ型は、可能な値のセットを減らすことによって交差します:
リーリーそして、プリミティブ型とオブジェクト型を交差させることで、プリミティブ型に新しいプロパティを追加できます。
リーリーしかし、プリミティブ型は別のプリミティブ型になることはできません。したがって、2 つの異なるプリミティブ型を交差させると、
になります。 リーリーnever
最後に、
void
はプリミティブ型です。つまり、これは
void & { foo:number }
ということは、プリミティブ型void
には属性foo
も含まれることを意味します。ただし、
void と string
は 2 つの異なるプリミティブ型であるため、never
を生成します。ただし、
String
はオブジェクト型 (経由) であるため、
void と Stringは
voidに
Stringを加えたプロパティです。 new String()
作成)。しかし、これには何の意味もありません。
void
をunknown
以外のものに割り当てることはできません。また、unknown
はプロパティを持つことはできません。したがって、void & Type
はコードベースに存在する理由がないと思います。それが必要だと思われる場合は、なぜそれが必要なのかを尋ね、コードが不要になるようにコードをリファクタリングしてみます。