typescript 类型脚本返回没有空值或未定义值的对象

dvtswwa3  于 2023-01-14  发布在  TypeScript
关注(0)|答案(2)|浏览(243)

我们在代码库中使用了一个cleanNullOrUndefined函数,如果一个对象的键值为null或未定义,该函数会删除该对象中的键值。这不是一个类型良好的函数,它只返回原始对象的一个Partial,这会在其他地方产生一些错误。
我们需要的是键入函数以返回对象,并删除为空或未定义的键,并为其他键推断类型。
示例:

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

// Desired return type

interface ReturnType {
  a: number,
  b: string,
  c: boolean
}

我好像不知道该怎么做。

mm5n2pyu

mm5n2pyu1#

请看这个例子:

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

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

wfsdck30

wfsdck302#

下面的代码可能是答案的一半,我想说明的是,你可以只使用一行代码(链)来获得目标对象:

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

const dest = Object.keys(obj)
    .filter(a => obj[a] !== null && obj[a] !== undefined)
    .reduce((c, a) => { c[a] = obj[a]; return c; }, {});

console.log(dest);

但可能还有很多,只是为了使结果类型被正确地推断出来。问题是--你真的需要它吗?)

相关问题