web-dev-qa-db-ja.com

「タイプ「{}」」とは何ですか?

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);
20
NPE

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 の複製としてクローズされました。

15
Spike

次のような呼び出し関数が必要です。

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'

あなたの例では、関数が{}を返すとコンパイラが推測した理由が正確にわかりません。

5
Nitzan Tomer

私の知る限りでは、 {}は、使用法のようにハッシュマップに直接キャストします。ドット表記ではなく、キープロパティのみを使用できます。

var o:{} = {}

同等である必要があります

var o:{[key:string]:any} = {}

そう

o.x = 5; //fails

だが

o['x'] = 5; //succeeds
4
ArcSine