Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Typescript:有条件地将对象属性标记为可选?_Javascript_Typescript - Fatal编程技术网

Javascript Typescript:有条件地将对象属性标记为可选?

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

例如:

但是,如果许多字段是可选的,那么条件可能会变得很长。有更好的方法吗?

键入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={};
为什么不呢?“但是,如果有很多字段是可选的,那么条件可能会变得很长”-会吗?您可能会使用交集类型,每个属性使用一个条件。@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] };