Проверка типов машинописного текста - PullRequest
0 голосов
/ 24 мая 2018
let a;
a = 5;
a = "hi";

Почему это допустимый код 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
},

Ответы [ 3 ]

0 голосов
/ 24 мая 2018

Это работает, потому что 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.

Вы получаете сообщение об ошибке, указывающее, что string не имеет свойства foo или number не имеет свойства dot.

Но, если вы напишите:

function(b) {
    return b + 2;
}

Эта функция, однако, указывает на ошибку, потому что нет ничего, что намекает компилятору о том, что тип b содержит.

0 голосов
/ 24 мая 2018

Почему это допустимый код TypeScript?

noImplicityAny влияет только на «аргументы», а не «переменные».

Следовательно, эти коды верны:

let a;
a = 'test';
a = 123;

Но вы получите ошибку, когда захотите объявить аргумент функции:

function log(someArg) { // Error : someArg has an implicit `any` type
    console.log(someArg);
} 

Этот код будет работать:

function log(someArg: any | string | number) { // Error : someArg has an implicit `any` type
    console.log(someArg);
} 

TypeScript гарантирует, что вы можете использовать типы и проверять их, когда переменная используется (например, в качестве аргумента).

Здесь вы можете найтистатья.

0 голосов
/ 24 мая 2018

Почему это допустимый код TypeScript?

Для обеспечения обратной совместимости с javascript.Это полностью допустимый js, поэтому он также должен быть верным машинописным шрифтом.Но вы можете легко выбрать проверку типов:

let a: number;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...