打字稿类型检查

Fox*_*Pro 0 javascript types typescript ecmascript-6

let a;
a = 5;
a = "hi";
Run Code Online (Sandbox Code Playgroud)

为什么这是有效的 TypeScript 代码?除了 «a:number» 之外,还有其他更严格的设置吗?如果不是,那么使用 TypeScipt 有什么意义,如果您可以使用 JavaScript + vscode //@ts-check?我的 tsconfig.json:

"compilerOptions": {
  "baseUrl": ".",
  "outDir": "build/dist",
  "module": "esnext",
  "target": "es6",
  "lib": ["es6", "dom"],
  "sourceMap": true,
  "allowJs": false,
  "strict": true,
  "jsx": "react",
  "moduleResolution": "node",
  "rootDir": "src",
  "forceConsistentCasingInFileNames": true,
  "noImplicitReturns": true,
  "noImplicitThis": true,
  "noImplicitAny": true,
  "strictNullChecks": true,
  "suppressImplicitAnyIndexErrors": true,
  "noUnusedLocals": true
},
Run Code Online (Sandbox Code Playgroud)

Osc*_*Paz 5

它有效,因为noImplicitAny不影响变量声明。如果声明了变量,但未声明其类型,则假定为any

这是这样定义的,因为编译器,尽管变量是any隐式的,但实际上可以在每一点确定它的类型。

事实上,如果你这样做:

var a;
a = 5;
a.dot(); // error, number does not have a 'dot' property.
a = "hi";
a.foo(); // error, string does not have a 'foo' property.
Run Code Online (Sandbox Code Playgroud)

你得到一个错误,表明string没有 property foo,或者number没有 property dot

但是,如果你写:

function(b) {
    return b + 2;
}
Run Code Online (Sandbox Code Playgroud)

然而,这个函数指示一个错误,因为没有任何东西可以提示编译器关于什么类型b保存。