如何根据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