繁体   English   中英

TypeScript:推断通用 keyof 的类型

[英]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 | 2Params[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

好的,希望有帮助; 祝你好运!

Playground 链接到代码

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM