【问题标题】:Narrowing type of T[K] when using K extends keyof T [duplicate]使用 K 时 T[K] 的缩小类型扩展 keyof T [重复]
【发布时间】:2020-11-21 04:20:23
【问题描述】:

我正在尝试定义一个接口,其中:

  • 一个属性是泛型类型的键
  • 另一个属性依赖于与另一个属性中的键关联的 的类型

我能得到的最接近的方法是让 Typescript 将 T[K] 解析为 T 的所有值的联合类型。但如果 K 是已知的字符串文字,似乎应该有一些方法可以进一步缩小范围。

这是我正在尝试做的一个示例。

测试

interface Person {
    age: number;
    name: string;
}

interface ColumnDef<T, K extends keyof T> {
    key: K;
    renderData: (value: T[K]) => void;
}

interface Report<T> {
    columns: ColumnDef<T, keyof T>[];
}

const report: Report<Person> = {
    columns: [
        {
            key: "age", // this is correctly typed to be "age"|"name"
            renderData: (value) => {
                // ideally value should be "number" here, but it is "string|number"
            }
        },
        {
            key: "name", // this is correctly typed to be "age"|"name"
            renderData: (value) => {
                // ideally value should be "string" here, but it is "string|number"
            }
        },
    ]
}

【问题讨论】:

  • 我坚信这个stackoverflow.com/questions/64744734/… 的答案会对你有所帮助。我什至会说,你的问题是重复的
  • 这似乎是相关的。我会研究一下这个问题,看看我是否可以将其应用于我的情况。
  • 你说得对,这正是我所需要的。感谢您为我指明正确的方向。

标签: typescript generics


【解决方案1】:

根据 Captain-yossarian 链接的相关问题,我能够使用 this answer 缩小类型。

如果它可以进一步帮助某人,这是我将其应用于我的示例案例的方法。

interface Person {
    age: number;
    name: string;
}

type ColumnDef<T> = {
    [K in keyof T]-?: BaseColumnDef<T, K>
  }[keyof T]


interface BaseColumnDef<T, K extends keyof T> {
    key: K;
    renderData: (value: T[K]) => void;
}

interface Report<T> {
    columns: ColumnDef<T>[];
}

const report: Report<Person> = {
    columns: [
        {
            key: "age", // this is correctly typed to be "age"|"name"
            renderData: (value) => {
                // value is now type "number"
            }
        },
        {
            key: "name", // this is correctly typed to be "age"|"name"
            renderData: (value) => {
                // value is now type "string"
            }
        },
    ]
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-25
    • 2020-01-02
    • 2019-03-21
    • 2022-01-21
    • 1970-01-01
    • 2019-02-02
    相关资源
    最近更新 更多