Typescript-用于派生相同类型但没有未定义属性的泛型

时间:2019-08-14 13:20:03

标签: typescript

我的类型带有一些可能未定义的字段

type Foo = { 
  a: string | undefined
  b: string
  c: string | undefined
}

我想要相同的类型,但是声明没有的字段未定义

type Bar = { 
  a: string
  b: string
  c: string
}

我想要一种从Bar导出Foo的方法,这样我就不必手动创建Bar并在Foo发生变化时对其进行更新。像这样

type Bar = NoPropertiesUndefined<Foo>

Typescript中是否内置了这样的泛型?

关于用例的注释-当我获得类型Foo作为输入,然后验证它以检查是否没有未定义的字段,然后传递给另一个函数进行进一步处理时,将使用此注释。我希望其他函数接受一个Bar参数,并让验证程序返回一个Bar或抛出该异常,以确保以一种类型安全的方式验证了FooFoo类型甚至可以使用ReturnType动态创建,因此,即使手动定义Bar也很繁琐,在某些情况下甚至是不可能的。

3 个答案:

答案 0 :(得分:1)

您是否需要像上面那样声明您的类型,或者可以将其略微更改为该类型?

type Foo = { 
  a?: string
  b: string
  c?: string
}

如果您可以做到这一点,那么内置Required泛型将满足您的要求,我认为:

type NoUndefinedFoo = Required<Foo>

有关详细信息,请参见here

以下是该通用类型的定义方式:

type Required<T> = { [P in keyof T]-?: T[P] };

即它将从您传递到?的{​​{1}}的每个属性中删除T

答案 1 :(得分:1)

问题中的NoPropertiesUndefined泛型可以这样实现

type NoPropertiesUndefined<T> = { [P in keyof T]: NonNullable<T[P]> }

您的使用方式如下:

type Bar = NoPropertiesUndefined<Foo>

Bar具有与Foo相同的所有字段,只是没有一个字段可以不确定。



我将接受我自己的答案,因为它可以直接解决我所遇到的确切问题,但是我通过Yoni Gibbs的答案来到了该解决方案,其中提到了相关的Required我从上面的实现中得到了灵感。如果您认为此答案有用,请对其进行投票!

答案 2 :(得分:0)

type Foo = { 
  a: string
  b: string
  c: string
}

如果您在TSConfig中启用了严格的null检查,则所有这些属性都无法定义。

在严格的null检查模式下,nullundefined值不在每种类型的域中,只能分配给自己和any(一个例外undefined也可以分配给void)。

另外,我认为您正在寻找...

type NonNullable<T> = T extends null ? never : T
// Exclude null and undefined from T

用法:

type Bar = NonNullable<Foo>;