如何根据TypeScript中的其他类型使对象属性成为可选的?

我认为解释我的场景的最好方法是用代码:

interface IPluginSpec {
  name: string;
  state?: any;
}

interface IPluginOpts<PluginSpec extends IPluginSpec> {
  name: PluginSpec['name'];
  // How to require opts.initialState ONLY when PluginSpec['state'] is defined?
  initialState: PluginSpec['state'];
}

function createPlugin<PluginSpec extends IPluginSpec>(
  opts: IPluginOpts<PluginSpec>,
) {
  console.log('create plugin', opts);
}

interface IPluginOne {
  name: 'pluginOne';
  // Ideally state would be omitted here, but I can also live with having to
  // define "state: undefined" in plugins without state
  // state: undefined;
}

// Error: Property 'initialState' is missing in type...
createPlugin<IPluginOne>({
  name: 'pluginOne',
  // How to make initialState NOT required?
  // initialState: undefined,
  // How to make any non-undefined initialState invalid?
  // initialState: 'anything works here',
});

interface IPluginTwo {
  name: 'pluginTwo';
  state: number;
}

createPlugin<IPluginTwo>({
  name: 'pluginTwo',
  initialState: 0,
});

转载请注明出处:http://www.intsu.net/article/20230517/2248277.html