Skip to content

Instantly share code, notes, and snippets.

@kenmori
Last active May 2, 2021 23:19
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kenmori/f9054f7a54ff458b715fbbcbeaabdf77 to your computer and use it in GitHub Desktop.
Save kenmori/f9054f7a54ff458b715fbbcbeaabdf77 to your computer and use it in GitHub Desktop.

1.optionalな部分を抜く「-?」

こちらの問題

から一人の答え をみて、

調べた先で

疑問に思ったこと

これだと

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

Improved control over mapped type modifiers

2.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment