在下面的示例中,当我期望使用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)
为什么返回类型不正确?
答案 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)
或者相反,正确键入回调并让编译器推断T
和T2
const actualString = doThing((ctx: Ok) => ctx.thing)
为什么返回类型为any
由于您没有提供正确的类型参数,因此TypeScript编译器会推断出返回类型,并且在您的示例中,ctx
的类型为any
,因此ctx.thing
的类型也是如此类型为any
的类型,反过来将T2
标记为any
。