から一人の答え をみて、
疑問に思ったこと
これだと
type RequiredKeys<T> = {
[K in keyof T]: T extends Record<K, T[K]> ? K : never
}[keyof T]
type A = RequiredKeys<{a: string, b?: string, c: number}>
A // "a" | "c" | undefined
になるが
type RequiredKeys<T> = {
[K in keyof T]-?: T extends Record<K, T[K]> ? K : never
}[keyof T]
こうすることで optionalなb
の値をnever
にさせて[keyof T]
で除外することができる
変更される様子は
type RequiredKeys<T> = {
[K in keyof T]-?: Record<K, T[K]>
}
type A = RequiredKeys<{a: string, b?: string, c: number}>
/// A
type A = {
a: Record<"a", string>;
b: Record<"b", string | undefined>;
c: Record<"c", number>;
}
->
type RequiredKeys<T> = {
[K in keyof T]-?: T extends Record<K, T[K]> ? K : never
}
type A = RequiredKeys<{a: string, b?: string, c: number}>
type A = {
a: "a";
b: never;
c: "c";
}
->
type B = {a: string, b?: string, c: number} extends {b: string | undefined} ? true : false
// B: false