首页 > 解决方案 > “”的这种行为是 TypeScript 类型系统错误吗?

问题描述

鉴于此代码,我希望 TypeScript 编译器会失败:

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

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

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

输出是:

object
string

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

游乐场链接

标签: typescript

解决方案


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

如果您认为这样的建议还不够,因为您不相信他人或您自己不会编写test(foo)上述代码,那么在完全抛弃 TypeScript 之前,您至少可以探索一个选项:linting

TSLint和TypeScript ESLint可以配置为禁止将值注释为 type 。调用 TSLint 的规则,调用TypeScript ESLint 的规则。这将导致您收到如下错误:anyno-anyno-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

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


推荐阅读