在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);
答案 0 :(得分:13)
type {}
考虑对象类型{ id: number, name: string }
,它代表一个2字段对象。此类法律价值包括{ id: 1, name: "Foo" }
和{ id: 2, name: "Bar" }
。
类型对象{}
表示0字段对象。此类型的仅合法值是一个空对象:{}
。
因此值 { id: 1, name: "Foo" }
属于类型 { id: number, name: string }
,而值 {}
(即一个空对象)是类型 {}
。
错误似乎是TypeScript编译器中的错误(我提交了一个问题here)。它无法在call
的调用中推断出类型参数。您可以通过显式指定类型参数来解决此问题:
let the_answer: number = call<number, NoArgsFn<number>>(get_the_answer);
但是,使用单一类型参数更简单,更直接,正如@NitzanTomer所建议的那样:
function call<T>(fn: NoArgsFn<T>): T {
return fn();
}
编辑:我提交的问题已作为#7234的副本关闭,将在TypeScript 2.0发布之前修复。
答案 1 :(得分:5)
你需要有这样的通话功能:
function call<T>(fn: NoArgsFn<T>): T {
return fn();
}
在原始call
函数中,您有两个在调用函数时未传递的泛型类型,并且编译器无法推断它们的类型。
类型{}
是一个对象文字(据我所知),所以你可以面对同样的错误:
var o = {};
var n: number = o; // Error: Type '{}' is not assignable to type 'number'
我不确定为什么编译器推断该函数在您的示例中返回{}
。
答案 2 :(得分:3)
据我所知,{}
直接转换为类似用法的哈希映射。您只能使用键控属性,而不是点符号。
var o:{} = {}
应该相当于
var o:{[key:string]:any} = {}
所以
o.x = 5; //fails
但是
o['x'] = 5; //succeeds