type stringUnion = "Value1"|"Value2"
我想从所有字符串中获取并创建一个数组stringUnion
所以数组看起来像这样["Value1","Value2"],我想要一个数组,这样我就可以像这样迭代它:
theArray.map((current, index)=>{
})
Run Code Online (Sandbox Code Playgroud)
我怎么做?
对的,这是可能的。
// credits goes to https://stackoverflow.com/questions/50374908/transform-union-type-to-intersection-type/50375286#50375286
type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (
k: infer I
) => void
? I
: never;
// credits goes to https://github.com/microsoft/TypeScript/issues/13298#issuecomment-468114901
type UnionToOvlds<U> = UnionToIntersection<
U extends any ? (f: U) => void : never
>;
type PopUnion<U> = UnionToOvlds<U> extends (a: infer A) => void ? A : never;
// credits goes to https://stackoverflow.com/questions/53953814/typescript-check-if-a-type-is-a-union#comment-94748994
type IsUnion<T> = [T] extends [UnionToIntersection<T>] ? false : true;
type UnionToArray<T, A extends unknown[] = []> = IsUnion<T> extends true
? UnionToArray<Exclude<T, PopUnion<T>>, [PopUnion<T>, ...A]>
: [T, ...A];
interface Person {
name: string;
age: number;
surname: string;
children: number;
}
type Result = UnionToArray<keyof Person>; // ["name", "age", "surname", "children"]
Run Code Online (Sandbox Code Playgroud)
这是另一种方法:
// credits goes to https://twitter.com/WrocTypeScript/status/1306296710407352321
type TupleUnion<U extends string, R extends any[] = []> = {
[S in U]: Exclude<U, S> extends never ? [...R, S] : TupleUnion<Exclude<U, S>, [...R, S]>;
}[U];
interface Person {
firstName: string;
lastName: string;
dob: Date;
hasCats: false;
}
type keys = TupleUnion<keyof Person>;
Run Code Online (Sandbox Code Playgroud)
更多解释你可以在我的博客中找到
| 归档时间: |
|
| 查看次数: |
2962 次 |
| 最近记录: |