TypeScript不推断对象中的回调返回类型

mv1qrgav  于 2022-12-24  发布在  TypeScript
关注(0)|答案(1)|浏览(204)

在这种情况下,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
}

但是编译器应该知道“回调”是一个返回数字的函数。有什么方法可以解决这个问题吗?

e5nqia27

e5nqia271#

TypeScript目前还没有在generic * types * 中推断类型参数的概念,就像调用泛型 * functions * 时那样。在microsoft/TypeScript#26242中有一个特性请求,如果实现的话,将允许使用一些符号来告诉编译器推断特定的类型参数。所以,也许,在未来的某一天,你可以写const myObject: MyObject<infer> = ...,或者const myObject: MyObject<*> = ...,甚至const myObject: MyObject = ...,得到你想要的行为,但是现在它还不是语言的一部分。
现在获得这种行为的唯一方法是使用一个返回其输入的通用helper标识函数:

const asMyObject = <T,>(m: MyObject<T>) => m;

所以你可以写const myObject = asMyObject(...)而不是const myObject: MyObject = ...,得到同样的结果:

const myObject = asMyObject({
    callback: () => 5
});

// const myObject: MyObject<number>

在这里,编译器在调用asMyObject()时将T推断为number,因此从asMyObject()返回的值是MyObject<number>类型,因此myObject变量也是MyObject<number>类型。
Playground代码链接

相关问题