【发布时间】:2020-12-14 04:37:44
【问题描述】:
问题
我正在尝试定义一个通用的 RequiredProps<T, K>,以便我可以要求接口 T 上的键 K 不可为空。
例如:
interface User {
id: string;
phoneNumber?: string;
}
type UserWithPhoneNumber = RequiredProps<User, 'phoneNumber'>
应该产生一个类型 UserWithPhoneNumber 等价于 { id: string; phoneNumber: string }
解决方案
经过反复试验,我得到了一些工作:
type RequiredProps<T, K extends keyof T> = {
[P in Exclude<keyof T, K>]: T[P];
} & {
[P in K]-?: T[P];
};
这会产生一个等效类型 { name: string } & { phoneNumber: string },但为了便于阅读,我希望它完全是 { id: string; phoneNumber: string }。
查看lib.es5.d.ts 中的其他类型,我想我可以使用条件类型来修复它,但是以下方法不起作用:
type RequiredProps<T, K extends keyof T> = {
[P in keyof T]: P extends K ? NonNullable<T[P]> : T[P];
};
为什么这不起作用,如何解决?
这是一个可以修改的 CodeSandbox: https://codesandbox.io/s/serene-meadow-j20w1?file=/src/index.ts
【问题讨论】:
标签: typescript typescript-generics conditional-types