有没有办法禁用 Typescript 2.4 版引入的弱类型检测?

Posted

技术标签:

【中文标题】有没有办法禁用 Typescript 2.4 版引入的弱类型检测?【英文标题】:Is there a way to disable Weak Type Detection introduced with Typescript Version 2.4? 【发布时间】:2018-02-24 12:32:46 【问题描述】:

在 Typescript 2.4 版中添加了弱类型检测。现在我同意这是一个很棒的功能,当您将值分配给没有与该类型的可选属性匹配的单个属性的类型时,它将有助于捕获一大堆错误。

不幸的是,对于一个最初用javascript编写然后迁移到Typescript的大型项目,会有使用弱类型漏洞的情况。

为了允许轻松迁移到 TS 2.4,然后逐步删除所有弱类型攻击 - 是否有人知道标志或黑客可以暂时禁用弱类型检测?

【问题讨论】:

你找到方法了吗?我真的不知道为什么编译器选项中不能有一个标志。因为推荐的解决方法并不总是符合建议。 @Fis 不,很遗憾没有。我们最终解决了这个问题。 【参考方案1】:

没有编译器标志,但我可以推荐你ts-migrate。它会将您现有的 js 转换为带有 any 的 ts 代码,其中推理不起作用。

【讨论】:

【参考方案2】:

通常在与完整的可选类型(也就是只有可选属性的对象)相交时会引发此错误。

有时在编写通用库代码时,这是您想要做的事情,即使交集也会产生一个完整的可选类型。

普通的 TS 交集不会让你与弱类型相交,但你可以自己实现交集:

export type WeakIntersect<T, U> = Record<string, never> extends T
  ? Record<string, never> extends U
    ? T & U // fallback to compiler check for weak types
    : U
  : Record<string, never> extends U
    ? T
    : T & U
FullyOptional1 & FullyOptional2 // error
WeakIntersect<FullyOptional1, FullyOptional2> // ok

在弱类型上使用extends也可以避免错误:

export type AllowWeakType<T> = Record<string, never> extends T ? any : T
T extends FullyOptional // error
T extends AllowWeakType<FullyOptional> // ok

【讨论】:

以上是关于有没有办法禁用 Typescript 2.4 版引入的弱类型检测?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在 TypeScript 的界面中记录字段?

第1009期TypeScript 2.4 新特性一览

有没有办法在 TypeScript 类定义中转义和使用保留字?

有没有办法在 javascript 文件中要求 typescript 文件?

有没有办法在 TypeScript 中动态应用数组映射器?

有没有办法禁用触摸?