我有这种类型:
type User = {
id: string;
name?: string;
email?: string;
}
我想用name
non optional构造一个类似的类型:
type UserWithName = {
id: string;
name: string;
email?: string;
}
与其像上面那样重复类型,我如何使用泛型实用程序类型从User
构造UserWithName
呢?
Required几乎完成了这项工作,但它将 * 所有 * 属性设置为非可选,而我只想设置 * 一个 * 属性。
8条答案
按热度按时间cuxqih211#
如果你需要使嵌套属性成为强制性的,那么交集就是你的朋友。它既适用于接口也适用于类型。
idfiyjo82#
您可以在type-fest中使用
SetRequired<Obj, 'key1' | 'key2'>
作为implemented here。yvfmudvl3#
如果您不想创建帮助类型,可以将必需与拾取结合使用
mznpcxlj4#
如果您检查
Required
类型的源代码,它是:同样的语法也可以用来构造一个泛型类型,它将给予您想要的结果:
Playground链接
y4ekin9u5#
您可以改用接口:
现在你已经构建了
User
类型,但是重写了name
属性使其成为强制性的。看看这个类型脚本练习场-没有name属性的UserWithName
将出错。vshtjzan6#
我认为这更简单,也很好用。给定
User
类型,你想让name
属性成为非可选的:要创建命名接口:
创建命名类型:
创建匿名类型:
我喜欢这种方法,因为您不需要定义一个新的泛型,但是您仍然可以从能够在
User
中自由更改name
属性的类型中获益,并且如果您更改name
属性的名称本身,也会显示一个错误。如果你不完全明白发生了什么,我用:
extends
关键字的替代方法,该关键字仅适用于命名接口)。nlejzf6q7#
我改进了上级提出的建议。
现在,您可以同时要求多个属性
现在需要所有属性
vnzz0bqm8#
对于那些寻找使用实用程序类型的答案的人来说,这应该是可行的