我正在尝试创建一个类型,该类型将接口作为泛型类型参数,并过滤掉值不是字符串的属性。
这就是我所拥有的:
interface Bla {
key1: string;
key2: number;
key3: string;
key4: boolean;
}
type PickStrings<T> = {
[K in keyof T]?: T[K] extends string ? T[K] : never;
}
const bla: PickStrings<Bla> = { // should error as key3 is not present
key1: 'string',
}
游乐场
使用[K in keyof T]?
的问题是它不会出错,因为密钥是可选的。但是,如果我使用[K in keyof T]
,它将检查接口中是否存在所有密钥。
我该怎么解决这个问题?
您可以创建一个类型来按类型提取密钥,然后将其与Pick
一起使用
type PickKeysByValueType<T, TYPE> = {
[K in keyof T]: T[K] extends TYPE ? K : never
}[keyof T]
type PickStrings<T> = Pick<T, PickKeysByValueType<T, string>>
游乐场