Javascript Typescript:有条件地将对象属性标记为可选?
例如: 但是,如果许多字段是可选的,那么条件可能会变得很长。有更好的方法吗?键入Foo={ “a”:字符串, “b”:未定义, } 类型栏={ propOne:Foo[T], 建议二:Foo[T] }; 类型UndefinedBarKeys={ [K in keyof Bar]:Bar[K]扩展未定义?K:从不 }[keyofbar]; 贝特巴型= Foo[T]扩展未定义 ? {[K in keyof Pick]?:Foo[T]} :巴; constbar1:BetterBar={propOne'asdf',propTwo'qwerty'}; 常量bar2:BetterBar={propOne:undefined,propTwo:undefined}; 常数bar3:BetterBar={};Javascript Typescript:有条件地将对象属性标记为可选?,javascript,typescript,Javascript,Typescript,例如: 但是,如果许多字段是可选的,那么条件可能会变得很长。有更好的方法吗?键入Foo={ “a”:字符串, “b”:未定义, } 类型栏={ propOne:Foo[T], 建议二:Foo[T] }; 类型UndefinedBarKeys={ [K in keyof Bar]:Bar[K]扩展未定义?K:从不 }[keyofbar]; 贝特巴型= Foo[T]扩展未定义 ? {[K in keyof Pick]?:Foo[T]} :巴; constbar1:BetterBar={propOne
为什么不呢?“但是,如果有很多字段是可选的,那么条件可能会变得很长”-会吗?您可能会使用交集类型,每个属性使用一个条件。@Emissary,因为这将允许OP想要防止的
bar0:Bar={}
。好吧,我误解了。
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">'.
type Bar<T extends keyof Foo> = Foo[T] extends undefined
? { foo?: undefined }
: { foo: Foo[T] };