unionとtupleの変換
code:ts
interface Person {
name: string;
age: number;
}
ここから["name", "age"]を取り出したい
interfaceからkeyofで"name" | "age"を取ることはできるので、tupleとunionの変換という観点になる
tupleからunionは簡単
["name", "age"][number]でいいっぽい
この逆が難しい
なんかhackeyな方法しかないっぽい
@jo32's solution worked for me, but I turn off use of any throughout my projects. Here is @jo32's solution with the conditional types swapped after extending never (instead of extends any)
code:ts
type UnionToIntersection<U> = (
U extends never ? never : (arg: U) => never
) extends (arg: infer I) => void
? I
: never;
type UnionToTuple<T> = UnionToIntersection<
T extends never ? never : (t: T) => T
extends (_: never) => infer W
: [];
interface Person {
firstName: string;
lastName: string;
dob: Date;
hasCats: false;
}
type keys = UnionToTuple<keyof Person>;
これがいい感じに見える
実用していいのかは分からない
code:ts
type UnionToIntersection<U> =
(
U extends never ? never : (arg: U) => never
) extends (arg: infer I) => void
? I
: never;
type Hoge5 = UnionToIntersection<string | string> //=> string
type Hoge6 = UnionToIntersection<string | number> //=> never
これもよくわからん
とくに最初のU extends never
これただたんにUのnever判定をしてるだけだとおもったら、違う
ここを削ると挙動が変わった
削ると、Uがそのまま返ってくる
U extends never ? never : (arg: U) => never
ここはわかった
型はexactじゃない
keyの順序の問題