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>>
需要使用两个步骤来获取我正在寻找的类型的键,然后使用这些键过滤对象。
我了解 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>>
需要使用两个步骤来获取我正在寻找的类型的键,然后使用这些键过滤对象。