Typescript Pick<> 使用类型而不是键

Typescript Pick<> using types rather than keys

我了解 pick 类型在打字稿中的工作原理。我多么想要它的一个版本,它会从界面中挑选所有字符串而不是使用键。

interface Nested {
    bla: string;
    other: number;
}

interface Testing {
    bla: string;
    other: number;
    list: Array<string>;
    list2: Array<string>;
    list3: Array<any>;
    list4: Array<number>;
    objecter: Nested
    objecter2: object
}


type NewPickType<T,Type> = // Some Typescript interface Logic 

type StringArrayOnlyType = NewPickType<Testing,Array<string>>

let obj: StringArrayOnlyType = {
    bla: "", // error
    other: 0, // error
    list: [""], // ok 
    list2: [""], // ok
    list3: [""], // ok
    list4: [0], // error
    objecter: { bla: "", other: 0 }, // error
    objecter2: {} // error
}

关于如何构建 NewPickType

的任何想法

发帖后才搞清楚,但这可能会对其他人有所帮助。

export type PickTypeKeys<Obj, Type, T extends keyof Obj = keyof Obj> = ({ [P in keyof Obj]: Obj[P] extends Type ? P : never })[T];

export type PickType<T, Type> = Pick<T, PickTypeKeys<T, Type>>
export type OmitType<T, Type> = Omit<T, PickTypeKeys<T, Type>>

需要使用两个步骤来获取我正在寻找的类型的键,然后使用这些键过滤对象。

Example