type customizeEmitsType = {};
type HasEmit<T, E> = E extends keyof T ? T[E] : undefined;
interface _ConfigItem<T = string> {
on: HasEmit<customizeEmitsType, T>;
}
这里 on 属性仍然是必填的?
如何修改才能在 customizeEmitsType 里面没有对应属性时不用填呢?
type customizeEmitsType = {};
type HasEmit<T, E> = E extends keyof T ? T[E] : undefined;
interface _ConfigItem<T = string> {
on: HasEmit<customizeEmitsType, T>;
}
这里 on 属性仍然是必填的?
如何修改才能在 customizeEmitsType 里面没有对应属性时不用填呢?
在 TypeScript 中,当你定义一个接口的属性为某个类型时,该属性默认是必需的。如果你想让某个属性变成可选的,你可以使用 ?
后缀来标记它。
在你提供的代码中,_ConfigItem
接口的 on
属性被定义为一个类型,而这个类型依赖于泛型 T
是否是 customizeEmitsType
的一个键。但是,即使 T
不是 customizeEmitsType
的一个键,on
的类型仍然是 undefined
,而不是可选的。
为了让 on
属性在 customizeEmitsType
中没有对应属性时变成可选的,你可以使用条件类型来定义 _ConfigItem
接口,这样当 T
不是 customizeEmitsType
的键时,on
属性就会变成一个可选的属性。下面是如何实现它的示例:
type customizeEmitsType = {};
type HasEmit<T, E> = E extends keyof T ? T[E] : undefined;
interface _ConfigItem<T = string> {
on?: HasEmit<customizeEmitsType, T>;
}
在上面的代码中,我在 on
属性后面添加了 ?
后缀,这样它就变成了一个可选的属性。现在,当 T
不是 customizeEmitsType
的一个键时,on
属性将变成可选的,并且其类型为 undefined
。如果 T
是 customizeEmitsType
的一个键,则 on
属性将变成必需的,并且其类型为 T[E]
。