有没有办法在Typescript中仅提取某种接口类型的值?

时间:2020-06-27 18:18:18

标签: typescript

我一直试图使以下代码与条件类型和映射类型一起使用无济于事。我可能会遗漏一些明显的东西,但是假设我有一个界面:

interface TestInterface {
    x: 1,
    y: "hello"
}

有没有办法做到这一点:

interface TestInterfaceButJustStrings {
    y: "hello"
}

赞:

type ExtractValues<T, U> = /* ??? */;
type TestInterfaceButJustStrings = ExtractValues<TestInterface, string>;

ExtractValues<T, U>T类型,只有属性值与U类型匹配的属性吗?

1 个答案:

答案 0 :(得分:1)

好吧!感谢@VLAZ,我得以弄清楚。解决方案:

type MatchingValues<T, U> = {
    [K in keyof T]: T[K] extends U ? K : never
}[keyof T];

type ExtractValues<T, U> = Pick<T, MatchingValues<T, U>>;

首先,MatchingValues创建所有扩展类型U的键的并集。

然后,Pick创建一个新类型,该类型仅具有T中也具有MatchingValues的属性。因此,我们最终得到的类型仅具有与我们的U类型匹配的属性。