TypeScriptでは、正確にはtype '{}'
と他の組み込み型にどのように関係していますか?
たとえば、次の例の最後の行はType '{}' is not assignable to type 'number'
、そして私は完全に明確ではありませんtype {}
はこのコンテキストにあります。実際、それはどのようにして発生しますか。
// A function taking no arguments and returning T
type NoArgsFn<T> = () => T;
// An instance of NoArgsFn<number>
function get_the_answer(): number {
return 42;
}
// Call the supplied function and return its value
function call<T, Fn extends NoArgsFn<T>>(fn: Fn): T {
return fn();
}
// Expect this to be equivalent to `let the_answer: number = 42', but
// instead get "Type '{}' is not assignable to type 'number'"
let the_answer: number = call(get_the_answer);
type {}
2フィールドオブジェクトを表すオブジェクトタイプ{ id: number, name: string }
について考えてみます。このタイプの有効な値には、{ id: 1, name: "Foo" }
および{ id: 2, name: "Bar" }
が含まれます。
タイプオブジェクト{}
は、0フィールドオブジェクトを表します。 onlyこのタイプの有効な値は空のオブジェクトです:{}
。
したがって、値{ id: 1, name: "Foo" }
はタイプ{ id: number, name: string }
であり、値{}
(つまり空のオブジェクト)はtype{}
です。
エラーはTypeScriptコンパイラのバグのようです(私は問題を提出しました here )。 call
の呼び出しで型引数を推測できません。タイプ引数を明示的に指定することにより、これを回避できます。
let the_answer: number = call<number, NoArgsFn<number>>(get_the_answer);
しかし、@ NitzanTomerが示唆したように、代わりに単一の型引数を使用する方が簡単で簡単です。
function call<T>(fn: NoArgsFn<T>): T {
return fn();
}
編集:私が提出した問題は、TypeScript 2.0のリリース前に修正される #7234 の複製としてクローズされました。
次のような呼び出し関数が必要です。
function call<T>(fn: NoArgsFn<T>): T {
return fn();
}
元のcall
関数には、関数を呼び出すときに渡さなかった2つのジェネリック型があり、コンパイラーはそれらがどの型であるかを推測できませんでした。
タイプ{}
はオブジェクトリテラル(私が知る限り)であるため、次のような同じエラーに直面する可能性があります。
var o = {};
var n: number = o; // Error: Type '{}' is not assignable to type 'number'
あなたの例では、関数が{}
を返すとコンパイラが推測した理由が正確にわかりません。
私の知る限りでは、 {}
は、使用法のようにハッシュマップに直接キャストします。ドット表記ではなく、キープロパティのみを使用できます。
var o:{} = {}
同等である必要があります
var o:{[key:string]:any} = {}
そう
o.x = 5; //fails
だが
o['x'] = 5; //succeeds