在这种情况下,TypeScript可以正确地推断类型,而无需显式地给出类型。
function myFunction<T>(callback: () => T) {
return callback();
}
const result = myFunction(() => 5); //TypeScript knows that "result" type is a Number.
但是它在对象内部不起作用,TypeScript强制我显式地给予一个类型。
type MyObject<T> = {
callback: ()=>T
}
const myObject: MyObject = { //Error happens, the compiler ask for a type here.
callback: ()=>5
}
但是编译器应该知道“回调”是一个返回数字的函数。有什么方法可以解决这个问题吗?
1条答案
按热度按时间e5nqia271#
TypeScript目前还没有在generic * types * 中推断类型参数的概念,就像调用泛型 * functions * 时那样。在microsoft/TypeScript#26242中有一个特性请求,如果实现的话,将允许使用一些符号来告诉编译器推断特定的类型参数。所以,也许,在未来的某一天,你可以写
const myObject: MyObject<infer> = ...
,或者const myObject: MyObject<*> = ...
,甚至const myObject: MyObject = ...
,得到你想要的行为,但是现在它还不是语言的一部分。现在获得这种行为的唯一方法是使用一个返回其输入的通用helper标识函数:
所以你可以写
const myObject = asMyObject(...)
而不是const myObject: MyObject = ...
,得到同样的结果:在这里,编译器在调用
asMyObject()
时将T
推断为number
,因此从asMyObject()
返回的值是MyObject<number>
类型,因此myObject
变量也是MyObject<number>
类型。Playground代码链接