【发布时间】:2021-02-26 10:54:34
【问题描述】:
给定一个 {...} 形式的对象 - 不是原语或数组 - 我想生成一个类型,它是该类型中的文字属性名称。我试过用映射类型来做这件事,但做错了。不知道我做错了什么。我可以深入一层(这实际上很容易使用 keyof 运算符)但无法弄清楚如何递归地进行。我知道我很接近,因为在下面的示例中,如果 email 属性不是可选的,它可以工作。所以不知何故,它被可选属性绊倒了。
type PropertyNames<
T extends Record<string, unknown>,
MODE extends 'deep' | 'shallow'
> = {
[KEY in keyof T & (string | number )]:
| KEY
| (MODE extends 'deep'
? T[KEY] extends Record<string, unknown>
? PropertyNames<T[KEY], 'deep'>
: never
: never);
}[keyof T & (string | number)];
type Email = {
address: string;
verified: boolean;
};
type UserToken = {
uid: string;
name?: string;
email?: Email;
};
// Expected: uid | name | email | address | verified
// Actual : uid | name | email
type DeepNames = PropertyNames<UserToken, 'deep'>;
// Expected and Actual : uid | name | email
type ShallowNames = PropertyNames<UserToken, 'shallow'>;
【问题讨论】:
标签: typescript