Typescript 返回没有 null 或未定义值的对象

And*_*sby 3 typescript

我们在代码库中使用一个cleanNullOrUndefined函数,如果键的值为空或未定义,该函数将删除对象中的键。这不是很好的类型,只是返回Partial原始对象,这在其他地方给出了一些错误。

我们需要的是输入函数来返回对象,其中键为 null 或未定义,删除并推断其他键的类型。

例子:

const obj = {
  a: 1,
  b: 'string',
  c: false,
  d: null,
  e: undefined
}

// Desired return type

interface ReturnType {
  a: number,
  b: string,
  c: boolean
}
Run Code Online (Sandbox Code Playgroud)

我似乎不知道如何做到这一点。

cap*_*ian 5

考虑这个例子:

const obj = {
  a: 1,
  b: 'string',
  c: false,
  d: null,
  e: undefined
}

type Validate<T> = Pick<T, {
  [Prop in keyof T]: T[Prop] extends null | undefined ? never : Prop
}[keyof T]>;

// type Test = {
//     a: 1;
//     b: 'string';
//     c: false;
// }
type Test = Validate<{
  a: 1,
  b: 'string',
  c: false,
  d: null,
  e: undefined
}>

const util = <Obj,>(obj: Obj): Validate<Obj> => {
  return 'NOT IMPLEMENTED' as any
}

const result = util({
  a: 1,
  b: 'string',
  c: false,
  d: null,
  e: undefined
})

result.a // ok
result.e // error
Run Code Online (Sandbox Code Playgroud)

操场

Validate迭代每个对象键并检查它是否扩展null | undefined。如果是 - 返回never,否则 - 返回键名Prop[keyof T]- 并从新创建的对象中获取所有值。Pick- 依次再次仅从 获取有效密钥T

  • 约塞连先生一如既往的出色回答,谢谢。 (2认同)
  • @eBoody 不要改变他们的代码的行为。根据需要添加第二部分,甚至发布您自己提到约塞连的答案。 (2认同)