typescript 从同一接口的另一个属性查询索引的类型脚本索引访问

but5z9lq  于 2022-12-30  发布在  TypeScript
关注(0)|答案(1)|浏览(100)

一个例子比语言更能说明我的问题:

interface X {
    a: number,
    b: string
}

interface KeyValue<T> {
    key: keyof T,
    value: T[this['key']]
}

const keyValue: KeyValue<X> = {
    key: 'a',
    value: 'Error! this should be a number'
};

我希望value的类型基于key的值,我的意思是,如果keya,那么我需要value的类型与X[a]的类型相同,即number,但目前,value的类型是string | number,它是X中所有值类型的联合类型。
我能用当前的 typescript 功能实现这一点吗?

8mmmxcuj

8mmmxcuj1#

你不能直接这么做你需要一个额外的类型参数

interface X {
    a: number,
    b: string
}

interface KeyValue<T, K extends keyof T> {
    key: K,
    value: T[this['key']] // or T[K]
}

const keyValue: KeyValue<X, 'a'> = {
    key: 'a',
    value: 0
};

为了避免两次键入属性名称,您可以使用函数来帮助创建。您需要一个fi函数来返回函数,因为Typescript还不允许部分类型参数推断

function newY<T>() {
    return function <K extends keyof T>(p: Y<T, K>) {
        return p;
    }
}

let xx = newY<X>()({ key: 'a', value:0})

相关问题