【问题标题】:Is this behavior of "????????????" a TypeScript Type System Bug?这是“????????????”的行为TypeScript 类型系统错误?
【发布时间】:2019-12-12 23:03:16
【问题描述】:

鉴于此代码,我预计 TypeScript 编译器会失败:

function test(f: string) {
    console.log(typeof f);
}

const foo: any = ["Test"];
test(foo);

const boo = "test";
test(boo);

输出是:

object
string

因为我不是 TypeScript 专家,所以我犹豫要不要在 GitHub 上写一个错误。大家怎么看?

Playground Link

【问题讨论】:

  • any 的重点是在需要时禁用 TypeScript 的类型检查。据我所知,按预期工作。
  • 你认为它会在哪里失败?在test(foo);?但是您已将 foo 注释为 any,这会故意关闭类型检查。您通常不应该在任何需要类型安全的地方使用 any
  • 我明白了,谢谢!那么作为 API 的设计者,function test(f: string) 并不能真正保证fstring 类型。 IMO,这不是很好,但这也是客观的。
  • 如果 API 需要绝对 100% 保证它是一个字符串,那么检查 typeof 并在失败或类似的情况下抛出错误。否则,开发人员应该知道使用any 会使他们面临发生此类事情的风险。我所知道的所有语言都有不安全的“使用风险自负”的特性,TypeScript 也不例外。
  • 再一次,这就是重点。不要使用any,除非您想要忽略类型注释。如果您可以解开安全带,那么在车上系安全带有什么意义?

标签: typescript


【解决方案1】:

the any type 的意义在于选择不对代码的某些部分进行类型检查。它是故意不健全的;所有类型都可分配给anyany 可分配给所有类型(never 除外)。这既有用又危险。很有用,因为有时候正确输入一段有效的真实世界代码很乏味、困难或不可能,而any 是一个逃生口。危险,因为编译器无法区分使用any 键入的有效 代码和使用any 键入的无效 代码。所以总的来说,any 的建议是“谨慎使用”。

如果你觉得这样的建议还不够,因为你不相信别人或你自己不要编写像上面的 test(foo) 这样的代码,那么在完全抛弃 TypeScript 之前,你至少可以探索一个选项:linting .

TSLintTypeScript ESLint 都可以配置为禁止将值注释为类型 any。 TSLint 的规则称为no-any,TypeScript ESLint 的规则称为no-explicit-any。这会导致您收到如下错误:

// TSLint
const foo: any = ["Test"];
// -----> ~~~~
// ERROR: no-any  Type declaration of 'any' loses type-safety. 
// Consider replacing it with a more precise type.

或者可能

// TypeScript ESLint
const foo: any = ["Test"];
// -----> ~~~~
// warning  Unexpected any. Specify a different type
// @typescript-eslint/no-explicit-any

好的,希望对您有所帮助;祝你好运!

【讨论】:

    猜你喜欢
    • 2019-10-22
    • 2012-11-20
    • 2021-11-13
    • 2012-08-28
    • 2010-12-05
    • 2021-12-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多