如何定义一个类型,使其仅需要实现另一个接口的一个属性

时间:2019-10-28 12:16:42

标签: typescript

如果我有界面:

interface ITest {
    a: number;
    b: string;
}

我想要实现一个接口,以便函数只需要接收具有接口属性的某些已定义子集的对象,例如,对于上面的示例,它可能只需要提取a 。我尝试了以下方法:

type WithOnly<T, K extends keyof T> = {
    [K in keyof T]: T[K];
}

export const f = (x: WithOnly<ITest, 'a'>) => settings.a * 2;

但是编译器似乎并不喜欢这样。它希望x也有b。有办法实现吗?

1 个答案:

答案 0 :(得分:1)

您已经很亲密了,因为您只想要K中指定的属性,所以您应该执行[P in K]: T[P];


type WithOnly<T, K extends keyof T> = {
    [P in K]: T[P];
}

Play

或者更好的方法是使用Pick<ITest, 'a'>,它已经完成了您想要的操作:

interface ITest {
    a: number;
    b: string;
}
export const f = (x: Pick<ITest, 'a'>) => x.a * 2;

f({ a: 1 })

Play