当前位置: 首页 > 知识库问答 >
问题:

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

夏奕
2024-04-23
type customizeEmitsType = {};type HasEmit<T, E> = E extends keyof T ? T[E] : undefined;interface _ConfigItem<T = string> {   on: HasEmit<customizeEmitsType, T>; }

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

共有2个答案

鄂伟兆
2024-04-23
/** * 判断类型是否相同 */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>; }
郏博瀚
2024-04-23

在 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]

 类似资料:
  • 我希望data是否必传由A[T]是否有必传属性决定。如何做呢?

  • 我刚刚注意到javadoc状态(强调为我的): 返回声明中包含的此枚举常量的名称。该方法可能被重写,尽管它通常不是必需的或不需要的。当存在更“程序员友好”的字符串窗体时,枚举类型应重写此方法。 默认情况下,和返回相同的内容,因此即使被重写,仍然可以通过方法访问枚举的名称。 编辑:供参考,的javadoc(强调与原文相同): 返回此枚举常量的名称,与在其枚举声明中声明的名称完全相同。大多数程序员应该

  • 我对同步块有一些疑问。在提问之前,我想分享另一个相关帖子链接的答案,以回答相关问题。我引用彼得·劳里的同一个答案。 > <块引号> 同步确保您对数据有一致的视图。这意味着您将读取最新值,其他缓存将获得最新值。缓存足够智能,可以通过特殊总线相互通信(JLS不需要,但允许)该总线意味着它不必触摸主存储器即可获得一致的视图。 如果您只使用同步,则不需要Volatile。如果您有一个非常简单的操作,而同步

  • 定义一个类型 条件1:变量类型是一个字符串。 条件2:变量值不是 get "typescript": "~5.2.2"

  • 怎样从当前数据库的状态来判断是否需要读写分离,最好经验丰富的老师来回答下。 我当前想到的是,是否可以通过 QPS/TPS 的值来判断呢?

  • 我正在使用验证用户电话号码。目前在我的情况下,我有一个屏幕,用户把电话号码和第二个屏幕上的otp。根据文件自动检索otp并在大多数情况下启动验证过程。所以我的问题是,它已经在Firebase Auth SDK中实现了这个,或者我应该自己实现它来检索SMS和自动填充OTP。