2017-12-27 7 views
2

も、彼の素晴らしい本TypeScript Deep Diveで型アサーションにbasarat説明付き:タイプから詳細な違い:活字体でtype`がようtype`が及び型アサーション`表現

基本的には、アサーションSTまたはTのサブタイプのいずれかがSのサブタイプである場合、STが成功します。

私は型注釈variable: typeや型アサーションexpression as type間の正確な違いがあると思いまして、より正確に型アサーションは、特にその活字のエラーに関して、仕事やされていないときいつか驚くべきことである:foo3foo5変数のためにそれらを参照してください怒鳴る:

interface Foo { 
    n?: number; 
    s: string; 
} 

const foo1 = {} as Foo;    // ok 
const foo2 = { n: 1 } as Foo;   // ok 
const foo3 = { n: '' } as Foo;  // KO: "Property 's' is missing..." 
const foo4 = { n: '' as any } as Foo; // ok 
const foo5 = { n: 1, x: 2 } as Foo; // KO: "Property 's' is missing..." 
const foo6 = { s: '', x: 2 } as Foo; // ok 
const foo7 = { s: 1, x: 2 } as Foo; // KO: "Types of property 's' are incompatible." 

私が気づいた他の違い:VSCodeでFooインタフェースでnプロパティの名前を変更することはアサートされている式には反映されません、それは注釈付きのタイプで働いている間変数。

+0

それエラー出て、プロパティのための間違った種類を提供しますが、エラーメッセージが他のいくつかのプロパティについて常にあるので、これは興味深いです。それ以外に、あなたが提供するプロパティー名が正しいタイプのものであれば、他のプロパティーを省略したり追加したりすることができます。 –

答えて

2

私は、変数は常に宣言された型に適合している必要があり、コンパイラに指示します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}が欠けています。snは間違ったタイプです(number | undefinedである必要があります)。別の方法では、{n?: number, s: string}のタイプがnstringである必要があります)に間違っています。構造型の非互換性を報告する際

完全なエラーメッセージが

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'. 
関連する問題