// Q: 如何定义一个 SetOptional 工具类型,支持把给定的 keys 对应的属性变成可选的?
type Foo = {
a: number;
b?: string;
c: boolean;
};
// 测试用例
type SomeOptional = SetOptional<Foo, "a" | "b">;
// Ans
type Simplify<T> = {
[P in keyof T]: T[P];
};
type SetOptional<T, K extends keyof T> = Simplify<
// Partial in 可有可无键值的那部分
// Pick 必须有的键值的那部分
Partial<Pick<T, K>> & Pick<T, Exclude<keyof T, K>>
>;
// type FooKeys = keyof Foo;
// const fooKey: FooKeys = 'b';
const fooInstance: Simplify<Foo> = {
a: 1,
// b: '23', // 可以加上, 也可以不加
c: false,
};
const fooOptionalInstance: SomeOptional = {
c: false,
};
// 设置属性变成必选: SetRequired
type SetRequired<T, K extends keyof T> = Simplify<
// Required Pick 必须有的键值的那部分
// Partial in 可有可无键值的那部分
Required<Pick<T, K>> & Partial<Pick<T, Exclude<keyof T, K>>>
>;
type SomeRequired = SetRequired<Foo, 'a' | 'b'>;
const fooRequiredInstance: SomeRequired = {
a: 1,
b: "str",
// c: false,
}
cript
2021-09-26 ts-给定的 keys 对应的属性变成可选/必选
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...