zl程序教程

您现在的位置是:首页 >  前端

当前栏目

[Typescript] 52. Medium - ObjectEntries

typescript Medium 52
2023-09-14 09:00:45 时间

Implement the type version of Object.entries

For example

interface Model {
  name: string;
  age: number;
  locations: string[] | null;
}
type modelEntries = ObjectEntries<Model> // ['name', string] | ['age', number] | ['locations', string[] | null];

 

/* _____________ Your Code Here _____________ */

type ObjectEntries<T extends object> = {
  [Key in keyof T]-?: Key extends keyof T ? [Key, T[Key] extends undefined ? undefined: Required<T>[Key]]: never
}[keyof T]

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

interface Model {
  name: string
  age: number
  locations: string[] | null
}

type ModelEntries = ['name', string] | ['age', number] | ['locations', string[] | null]

type cases = [
  Expect<Equal<ObjectEntries<Model>, ModelEntries>>,
  Expect<Equal<ObjectEntries<Partial<Model>>, ModelEntries>>,
  Expect<Equal<ObjectEntries<{ key?: undefined }>, ['key', undefined]>>,
  Expect<Equal<ObjectEntries<{ key: undefined }>, ['key', undefined]>>,
]

 

type ObjectEntries<T extends object> = {
  [Key in keyof T]-?: Key extends keyof T ? [Key, T[Key] extends undefined ? undefined: Exclude<T[Key], undefined>]: never
}[keyof T]