我有这种类型:
type User = {
id: string;
name?: string;
email?: string;
}
Run Code Online (Sandbox Code Playgroud)
我想构造一个类似的name非可选类型:
type UserWithName = {
id: string;
name: string;
email?: string;
}
Run Code Online (Sandbox Code Playgroud)
我如何使用通用实用程序类型进行构造,而UserWithName不是像上面那样重复类型?必需的几乎可以完成这项工作,但它将所有属性设置为非可选,而我只想设置一个属性。User
Voj*_*nad 130
如果你检查类型的来源Required,它是这样的:
type Required<T> = {
[P in keyof T]-?: T[P]
}
Run Code Online (Sandbox Code Playgroud)
可以使用相同的语法来构造泛型类型,它将为您提供所需的内容:
type User = {
id: string
name?: string
email?: string
}
type WithRequired<T, K extends keyof T> = T & { [P in K]-?: T[P] }
type UserWithName = WithRequired<User, 'name'>
// error: missing name
const user: UserWithName = {
id: '12345',
}
Run Code Online (Sandbox Code Playgroud)
Set*_*ske 24
您可以使用接口代替:
interface User {
id: string;
name?: string;
email?: string;
}
interface UserWithName extends User {
name: string;
}
Run Code Online (Sandbox Code Playgroud)
现在您已经在该User类型的基础上进行了构建,但将name属性覆盖为强制属性。查看这个打字稿游乐场-UserWithName没有 name 属性的打字稿将会出错。
Amr*_*lon 20
如果不想做辅助类型,可以将Required和Pick结合起来
type User = {
id: string;
name?: string;
email?: string;
}
const user: Required<Pick<User, 'name'>> & User = {
id: '1',
name: 'Jim'
}
Run Code Online (Sandbox Code Playgroud)
cpr*_*ack 19
我认为这更简单并且效果很好。给定User您想要使name属性成为非可选的类型:
type User = {
id: string;
name?: string;
email?: string;
}
Run Code Online (Sandbox Code Playgroud)
创建命名接口:
interface UserWithName extends User {
name: NonNullable<User['name']>
}
let personWithName1: UserWithName;
Run Code Online (Sandbox Code Playgroud)
要创建命名类型:
type UserWithName = User & {
name: NonNullable<User['name']>
}
let personWithName2: UserWithName;
Run Code Online (Sandbox Code Playgroud)
创建匿名类型:
let personWithName3: User & { name: NonNullable<User['name']> }
Run Code Online (Sandbox Code Playgroud)
我喜欢这种方法,因为您不需要定义一个新的泛型,但您仍然可以从能够自由更改name中的属性类型中受益User,并且如果您更改 的名称本身,您也会看到错误该name财产。
如果您不完全理解发生了什么,我正在使用:
小智 7
我对上面提出的建议进行了改进。
type Required<T, K extends keyof T> = T & { [P in K]-?: T[P] }
type WithRequired<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>> & Required<T, K>
Run Code Online (Sandbox Code Playgroud)
现在您可以一次需要多个属性
interface foo {x?: number, y?: String}
WithRequired<foo, 'x' | 'y'>
Run Code Online (Sandbox Code Playgroud)
现在需要每个属性
对于那些寻找使用实用程序类型的答案的人来说,这应该可行
type WithRequiredProp<Type, Key extends keyof Type> = Type & Required<Pick<Type, Key>>;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
64054 次 |
| 最近记录: |