我的类型带有一些可能未定义的字段
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
或抛出该异常,以确保以一种类型安全的方式验证了Foo
。 Foo
类型甚至可以使用ReturnType
动态创建,因此,即使手动定义Bar
也很繁琐,在某些情况下甚至是不可能的。
答案 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
检查模式下,null
和undefined
值不在每种类型的域中,只能分配给自己和any
(一个例外undefined
也可以分配给void
)。
另外,我认为您正在寻找...
type NonNullable<T> = T extends null ? never : T
// Exclude null and undefined from T
用法:
type Bar = NonNullable<Foo>;