如何解决打字稿:有条件地将对象属性标记为可选?
例如:
type Foo = {
'a': string,'b': undefined,};
type Bar<T extends keyof Foo> = {
foo: Foo[T],};
const bar1: Bar<'a'> = { foo: 'a' }; // ok
const bar2: Bar<'b'> = { foo: undefined }; // ok
const bar3: Bar<'b'> = {}; // Property 'foo' is missing in type '{}' but required in type 'Bar<"b">'.
在此示例中,我希望foo
属性为可选,如果其值为undefined
。换句话说,我希望{ foo: undefined }
和{}
可以互换。
在我的实际代码中,我有一些有条件地返回不同字段的API处理程序。如果不需要字段,我想忽略它,而不必将其定义为undefined
。
type Bar<T extends keyof Foo> = Foo[T] extends undefined
? { foo?: undefined }
: { foo: Foo[T] };
但是,如果许多字段是可选的,那么条件可能会变得很长。有更好的方法吗?
解决方法
type Foo = {
'a': string,'b': undefined,}
type Bar<T extends keyof Foo> = {
propOne: Foo[T],propTwo: Foo[T]
};
type UndefinedBarKeys<T extends keyof Foo> = {
[K in keyof Bar<T>]: Bar<T>[K] extends undefined ? K : never
}[keyof Bar<T>];
type BetterBar<T extends keyof Foo> =
Foo[T] extends undefined
? { [K in keyof Pick<Bar<T>,UndefinedBarKeys<T>>]?: Foo[T] }
: Bar<T>;
const bar1: BetterBar<'a'> = { propOne: 'asdf',propTwo: 'qwerty'};
const bar2: BetterBar<'b'> = { propOne: undefined,propTwo: undefined };
const bar3: BetterBar<'b'> = {};
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。