由作为参数提供的回调的返回类型提供的函数的返回类型

时间:2019-07-28 06:13:59

标签: typescript

在下面的示例中,当我期望使用shouldBeString时,any的类型为string

function doThing<T, T2>(fn: (p: T) => T2) {
    return fn({} as any)
}

interface Ok {
    thing: string
}

const shouldBeString = doThing<Ok>(ctx =>ctx.thing) 

为什么返回类型不正确?

TypeScript playground example

1 个答案:

答案 0 :(得分:0)

TypeScript当前不允许仅指定某些模板类型参数。您可以遵循有关在GitHub上仅允许泛型类型参数的子集的讨论:

Allow specifying only a subset of generic type parameters explicitly instead of all vs none

立即的解决方案是设置两个模板参数

const actualString = doThing<Ok, string>(ctx => ctx.thing)

或者相反,正确键入回调并让编译器推断TT2

const actualString = doThing((ctx: Ok) => ctx.thing)

为什么返回类型为any

由于您没有提供正确的类型参数,因此TypeScript编译器会推断出返回类型,并且在您的示例中,ctx的类型为any,因此ctx.thing的类型也是如此类型为any的类型,反过来将T2标记为any