我不明白为什么有时打字稿无法推断 const 的泛型类型。
这是一个例子:
type OneTwoThree = 1 | 2 | 3;
type MyType<num extends OneTwoThree> = {
n: num;
}
const first: MyType = { // <-- Generic type 'MyType' requires 1 type argument(s).(2314)
n: 2,
};
const second: MyType<3> = {
n: 3,
};
为什么打字稿无法推断出这一点first
属于类型MyType<2>
?
我也尝试过声明MyType
这样:
type MyType<num extends OneTwoThree = OneTwoThree> = {
n: num;
}
但这样首先成为类型const first: MyType<OneTwoThree>
...
这是游乐场链接:https://www.typescriptlang.org/play?#code/C4TwDgpgBA8gdhAKgdwPaIBYCcLQLxQCMUAPlAEylQDMA3AFD2iRQCyIi4EAPHAK4BbKBAAewCHAAmAZ1gIU6bLigF4SNJhwQAfCqgBvelGNQ4ALlOCGAX0YBjVHGnAoAMwCWWZxfacWBQxNTC3IAG nprBnoHJxdpCBjJHw4ubmpdAKMTcxpwyKA
有什么建议么?
这是 TypeScript 所缺少的功能;编译器不会推断类型参数generic types, 像N
在你的MyType<N>
。正如您所注意到的,使用通用参数默认值 does not做这个;当您使用默认值时,您将获得默认值而不是类型推断。仅当您调用通用时功能编译器是否会尝试推断类型参数。
有一个相当长期的公开请求:微软/TypeScript#32794支持泛型类型中的类型参数推断,但目前它还不是该语言的一部分。请注意,由于存在通用参数默认值,因此您将无法获得这样的结果const first: MyType = ...
. You might能够写出类似的东西const first: MyType<infer> = ...
,并可能重写默认值,使其类似于type MyType<N extends OneTwoThree = infer> = ...
,但这只是猜测,因为它还不是一个功能。
除非提供这样的功能,否则通常的解决方法是编写通用辅助身份函数。该函数除了返回其输入之外不执行任何操作,但是当您调用通用函数时,您会得到您正在寻找的推论。所以而不是const first: MyType = {...}
,你会写const first = asMytype({...})
:
const asMyType = <N extends OneTwoThree>(m: MyType<N>) => m;
const first = asMyType({
n: 2,
});
// const first: MyType<2>
Playground 代码链接
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)