2016-10-22 13 views
3

次のコードブロックは、活字体で合法ではなく、流れで:TypeScriptがオブジェクトの型/ thisを推論する方法はありますか?

var o = { 
    x: 1, 
    foo() { this.x = 'a'; } 
}; 

o.foo(); 

私はオブジェクトのインターフェイスを作成する場合、それは失敗することができます:

interface Obj { 
    x: number; 
    foo(this: Obj): void; 
} 

var o = { 
    x: 1, 
    foo(this: Obj) { this.x = 'a'; } 
}; 

o.foo(); 

は、活字体のコンパイルオプションがありますそれは流れのように動作させるために? (つまり、インターフェイスは必要ありません)

+0

どのように「this」という名前のパラメータを持つことができますか? – cartant

+1

これはTypeScriptが 'this'のタイプをチェックする唯一の方法です。 https://www.typescriptlang.org/docs/handbook/functions.htmlを参照して、「this parameters」を検索してください。 – Manuel

+0

私はこれを期待していません。外側のタイプは、その関数のコンテキストでは完全に定義されていません。しかし、必ずしもインターフェースを定義する必要はありません。通常のオブジェクト型リテラルを使用してプロパティを追加するだけでよいでしょう。 –

答えて

0

これは最終的にoの型を推測しています。この例では、それが唯一の第二の割り当てのための所望のエラーを与える:

var o = { 
    x: 1, 
    foo() { this.x = 'a'; } 
}; 


o.x = 'b'; 

z.ts(7,1):エラーTS2322:タイプ「string」は 「番号」タイプに割り当てません。

明示的なことはなく、結果は驚くべきものであるthisタイプにtypeof oを使用しようとすると:

var o = { 
    x: 1, 
    foo(this: typeof o) { this.x = 'a'; } 
}; 


o.x = 'b'; 

エラーなし。しかし、なぜ?

z.ts(1,5):エラーTS7022:「O」は暗黙のうちに、それが型注釈を持って ていないため、「あらゆる」を入力している説明については、--noImplicitAnyと同じコードをコンパイルしよう 自身のイニシャライザで直接的または間接的に参照されます。

私は「自分自身のイニシャライザで直接的または間接的にそれを参照する」ことでそれを悪化させました。

foo以外の機能を定義するのはoのオブジェクトのようです。幸い、typescriptですがotypeof oが定義されている参照するとOKです:

function foo(this: typeof o) { this.x = 'a'; } 

var o = { 
    x: 1, 
    foo: foo 
}; 

o.foo(); 

t.ts(1,32):エラーTS2322:タイプ 'string' が '番号' を入力する割り当て可能ではありません。

関連する問題