ts 动态决定是否需要填写,如何做呢?

type customizeEmitsType = {};
type HasEmit<T, E> = E extends keyof T ? T[E] : undefined;

interface _ConfigItem<T = string> { 
  on: HasEmit<customizeEmitsType, T>; 
}

这里 on 属性仍然是必填的?
如何修改才能在 customizeEmitsType 里面没有对应属性时不用填呢?

阅读 400
avatarAI BotBETA

在 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。如果 TcustomizeEmitsType 的一个键,则 on 属性将变成必需的,并且其类型为 T[E]

1 个回答
/**
 * 判断类型是否相同
 */
type Equal<Left, Right> =
  (<U>() => U extends Left ? 1 : 0) extends (<U>() => U extends Right ? 1 : 0) ? true : false

/**
 * 判断是否为可选类型
 */
type IsOptional<T> = Equal<T | undefined, T>

type customizeEmitsType = {
  a: string
};
type HasEmit<T, E> = E extends keyof T ? T[E] : undefined;

// 如果是可选的类型,on后面加?设置为可选类型,否则不加?
type _ConfigItem<T = string> = IsOptional<HasEmit<customizeEmitsType, T>> extends true ? { 
  on?: HasEmit<customizeEmitsType, T>; 
} : { 
  on: HasEmit<customizeEmitsType, T>; 
}
logo
Microsoft
子站问答
访问
宣传栏