![](/img/trans.png)
[英]Declare a constructor to correctly infer generic type from (keyof) argument in TypeScript
[英]TypeScript: Infer type of generic keyof
我有这样的类型:
type GenericType<T, K extends keyof T = keyof T> = {
name: K;
params: T[K]
}
type Params = {
a: 1;
b: 2;
}
const test: GenericType<Params> = {
name: "a",
params: 2
}
当我创建一个像test
这样具有属性name: "a"
的对象时name: "a"
我希望推断params
的类型,以便params
必须是1
。 在我的示例中,params 的类型为1 | 2
1 | 2
即Params[keyof Params]
。 但是由于name
是"a"
我认为应该可以将params
的类型限制为1
而无需指定第二个泛型类型,如const test: GenericType<Params, "a">
。 基本上我想要的是:
type GenericType<T> = {
name: keyof T;
params: T[value of name]
}
这可以用打字稿吗?
当然,您希望GenericType<T>
成为union ,这可以通过映射T
的属性然后通过查找 type将该映射类型加入联合来实现:
type GenericType<T> = {
[K in keyof T]: {
name: K;
params: T[K]
}
}[keyof T];
现在你会得到你想要的行为,我想:
const test: GenericType<Params> = { // error!
name: "a",
params: 2
}
const good: GenericType<Params> = {
name: "b",
params: 2
}
您可以验证类型GenericType<Params>
计算结果为{ name: "a"; params: 1; } | { name: "b"; params: 2; }
{ name: "a"; params: 1; } | { name: "b"; params: 2; }
{ name: "a"; params: 1; } | { name: "b"; params: 2; }
,所以你需要正确的匹配name
与正确的params
。
好的,希望有帮助; 祝你好运!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.