我一直试图使以下代码与条件类型和映射类型一起使用无济于事。我可能会遗漏一些明显的东西,但是假设我有一个界面:
interface TestInterface {
x: 1,
y: "hello"
}
有没有办法做到这一点:
interface TestInterfaceButJustStrings {
y: "hello"
}
赞:
type ExtractValues<T, U> = /* ??? */;
type TestInterfaceButJustStrings = ExtractValues<TestInterface, string>;
ExtractValues<T, U>
是T
类型,只有属性值与U
类型匹配的属性吗?
答案 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
类型匹配的属性。