我想构建一个类型的所有所需键的字符串联合。示例:
interface IPerson {
readonly name: string;
age?: number;
weight: number;
}
RequiredKeys<IPerson> // a type returning "name" | "weight"
ReadonlyKeys<IPerson> // a type returning "name"
我想不出如何过滤出可选(或只读)键
发布于 2019-04-16 01:10:58
TypeScript还没有一个内置的方法来提取optionals。
interface IPerson {
readonly name: string;
age?: number;
weight: number;
}
// First get the optional keys
type Optional<T> = {
[K in keyof T]-?: ({} extends { [P in K]: T[K] } ? K : never)
}[keyof T];
// Use the pick to select them from the rest of the interface
const optionalPerson: Pick<IPerson, Optional<IPerson>> = {
age: 2
};
发布于 2019-04-16 01:23:54
谢谢@ali-habibzadeh
type RequiredKeys<T> = {
[K in keyof T]-?: ({} extends { [P in K]: T[K] } ? never : K)
}[keyof T];
type OptionalKeys<T> = {
[K in keyof T]-?: ({} extends { [P in K]: T[K] } ? K : never)
}[keyof T];
要获得只读/可写密钥,您可以使用:Details
type IfEquals<X, Y, A=X, B=never> =
(<T>() => T extends X ? 1 : 2) extends
(<T>() => T extends Y ? 1 : 2) ? A : B;
type WritableKeys<T> = {
[P in keyof T]-?: IfEquals<{ [Q in P]: T[P] }, { -readonly [Q in P]: T[P] }, P>
}[keyof T];
type ReadonlyKeys<T> = {
[P in keyof T]-?: IfEquals<{ [Q in P]: T[P] }, { -readonly [Q in P]: T[P] }, never, P>
}[keyof T];
https://stackoverflow.com/questions/55693618
复制相似问题