私は、変数は常に宣言された型に適合している必要があり、コンパイラに指示しますvariable: type
型宣言
タイプとして
variable: type
型注釈の間と型アサーション式の正確な違いは何かと思いまして。値が変数に代入されたとき(値が宣言された型と互換性がなければならないとき)、そして変数が使用されるときはいつでも、型チェッカーによって使用されます(宣言された変数の型は、それぞれの特定の場所)。
タイプアサーションは、組み込みタイプの互換性ルールをオーバーライドします。値が実際にアサーションで指定した型に準拠していることをコンパイラに伝えることができるため、型の非互換性に関するエラーメッセージが抑制されます。しかし、制限があります - あなたはその変数があなたが欲しいタイプを持っていると主張することはできません(ちょうどそのためにany
タイプがあります)。型アサーションが機能するためにあなたは、問題の
を引用したようタイプSからTへのアサーションはどちらかSがTまたはTのサブタイプである場合にはS
のサブタイプであることが作品に成功します正確に各例ではその方法で:
const foo3 = { n: '' } as Foo; // KO: "Property 's' is missing..."
ここでは二つのタイプ:{n?: number, s: string}
と{n: string}
は、互換性のためにチェックされている - それらのいずれかが別のものに変換することができます。いずれにせよ、どちらの方法でも行うことはできません。{n: string}
が欠けています。s
とn
は間違ったタイプです(number | undefined
である必要があります)。別の方法では、{n?: number, s: string}
のタイプがn
(string
である必要があります)に間違っています。構造型の非互換性を報告する際
完全なエラーメッセージが
Type '{ n: string; }' cannot be converted to type 'Foo'.
Property 's' is missing in type '{ n: string; }'.
、コンパイラはエラーメッセージに表示するために一つだけ互換性のないプロパティを選択している - それは、上記の3つの非互換性のいずれかである可能性があります。
const foo4 = { n: '' as any } as Foo; // ok
ワークス{n?: number, s: string}
は{n: any}
と互換性があるため:最初のものは、第二に割り当てることができる - any
は何と互換性があり、そしてs
はちょうど(基本的に、値は、IFタイプと互換性が無視されますそれは
const foo5 = { n: 1, x: 2 } as Foo; // KO: "Property 's' is missing..."
)宣言されたタイプと互換性のあるすべての非オプションの特性を有します210は{n?: number, s: string}
に割り当てることではありません - コンパイラが言うように、不足しているs
:{s: string, x: number}
は{n?: number, s: string}
に割り当て可能であるため、
Type '{ n: number; x: number; }' cannot be converted to type 'Foo'.
Property 's' is missing in type '{ n: number; x: number; }'.
const foo6 = { s: '', x: 2 } as Foo; // ok
作品:s
することは、それは、オプションとして宣言されますので、n
が不足してOKで、OKです余分なx
は無視されます
const foo7 = { s: 1, x: 2 } as Foo; // KO: "Types of property 's' are incompatible."
の
タイプは互換性がありません:
Type '{ s: number; x: number; }' cannot be converted to type 'Foo'.
Types of property 's' are incompatible.
Type 'number' is not comparable to type 'string'.
それエラー出て、プロパティのための間違った種類を提供しますが、エラーメッセージが他のいくつかのプロパティについて常にあるので、これは興味深いです。それ以外に、あなたが提供するプロパティー名が正しいタイプのものであれば、他のプロパティーを省略したり追加したりすることができます。 –