[Typescript] 118. Hard - IsRequiredKey

Implement a generic IsRequiredKey<T, K> that return whether K are required keys of T .

For example

type A = IsRequiredKey<{ a: number, b?: string },'a'> // true
type B = IsRequiredKey<{ a: number, b?: string },'b'> // false
type C = IsRequiredKey<{ a: number, b?: string },'b' | 'a'> // false

 

/* _____________ Your Code Here _____________ */
type Equal<T, U> = (<P>(x: P) => T extends P ? 1 : 2) extends (<P>(x: P) => U extends P ? 1 : 2) ? true: false;
type RequiredKeys<T> = keyof {
  [Key in keyof T as T[Key] extends Required<T>[Key] ? Key: never]: T[Key]
}
type IsRequiredKey<T, K extends keyof T> = Equal<K,RequiredKeys<T>> extends true ? true : false;

/* _____________ Test Cases _____________ */
import type { Expect } from '@type-challenges/utils'

type cases = [
  Expect<Equal<IsRequiredKey<{ a: number; b?: string }, 'a'>, true>>,
  Expect<Equal<IsRequiredKey<{ a: number; b?: string }, 'b'>, false>>,
  Expect<Equal<IsRequiredKey<{ a: number; b?: string }, 'b' | 'a'>, false>>,
]

 

posted @ 2022-11-26 16:27  Zhentiw  阅读(27)  评论(0)    收藏  举报