【问题标题】:Is there a way to disable comparison any vs other type?有没有办法禁用任何与其他类型的比较?
【发布时间】:2020-06-22 20:44:40
【问题描述】:

Typescript 在检查不同类型时有非常酷的错误消息:

let strange_boolean = true;
let strange_string: string = "1";
console.log(strange_boolean == strange_string);
error: TS2367 [ERROR]: This condition will always return 'false' since the types 'boolean' and 'string' have no overlap.
console.log(strange_boolean == strange_string);
            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

但是这段代码可以编译:

let strange_boolean: any = true;
let strange_string: string = "1";
console.log(strange_boolean == strange_string);

因为any可以转换成anything ...

但是,如果我想以某种方式禁用从 any 到任何东西的隐式转换怎么办? Typescript 有任何标志吗? 我希望这段代码只在这种情况下编译:

let strange_boolean: any = true;
let strange_string: string = "1";
console.log(String(strange_boolean) == strange_string);

let strange_boolean: any = true;
let strange_string: string = "1";
console.log(Boolean(strange_boolean) == Boolean(strange_string));

【问题讨论】:

  • 我最近没有写太多 TypeScript,但也许 unknown 类型在这里有帮助?
  • @JoachimSauer 什么是未知类型......实际上它甚至适用于这种奇怪的类型......但我想像任何 == 字符串一样禁用工作代码......我只想要明确的行动,显式转化
  • 由于== 是参考比较,我认为没有直接的方法可以实现您想要的,但unknown 类似于any,除了any 是“这可以是任何东西,所以你可以用它做任何事情”,unknown 更多的是“这可能是任何东西,所以你需要在用它做任何事情之前检查它是什么”。
  • TS 编译器不会为您执行此操作,但如果您使用像 ESLint 这样的 linter,您可以使用像 no-explicit-any 这样的规则。这能回答你的问题吗?

标签: typescript coercion type-coercion


【解决方案1】:

很遗憾,目前不存在这种可能性……(

我已经创建了问题 https://github.com/microsoft/TypeScript/issues/39209,但它已关闭,因为 Typescript 团队不希望破坏 any 的向后可比性,这很不幸,因为如果他们添加此标志,那么代码将变得比“Vanilla”中的代码更安全" JavaScript

【讨论】:

    猜你喜欢
    • 2019-06-24
    • 2020-02-18
    • 2023-03-17
    • 1970-01-01
    • 2014-07-28
    • 1970-01-01
    • 2014-04-23
    • 2023-03-10
    相关资源
    最近更新 更多