Как предотвратить неопределенность члена в конструкторе с использованием TypeScript? - PullRequest
0 голосов
/ 06 ноября 2018

Я внес ошибку, написав такой класс:

class SomeClass {
    private readonly item: string;

    constructor(item: string) {
        // bug, item is never  assigned
    }

    public getInfo(): string {
        return this.item; // always returns `undefined`
    }
}

элемент никогда не назначается, и поэтому каждый вызов getInfo() возвращает undefined. Этот код успешно переносится, хотя.

Стиль кода моего текущего проекта не позволяет использовать конструктор сокращений с помощью правила no-parameter-properties tslint, и, следовательно, я не могу сделать:

class SomeClass {
    public constructor(private readonly item: string) {
    }

    public getInfo() {
        return this.item;
    }
}

Я ожидал, что tsc выдаст ошибку из-за настройки strictNullChecks моего tsconfig.

Есть ли способ заставить машинописный текст обнаружить эту ошибку и пометить ее компиляцию как ошибку?

Это мой текущий tsconfig.json compilerOptions:

  "compilerOptions": {
    "target": "ES6",
    "lib": [
      "es6",
      "es2017",
      "DOM"
    ],
    "module": "commonjs",
    "pretty": true,
    "outDir": "dist",
    "sourceMap": true,
    "experimentalDecorators": true,
    "emitDecoratorMetadata": true,
    "strictNullChecks": true,
    "forceConsistentCasingInFileNames": true,
  }

1 Ответ

0 голосов
/ 06 ноября 2018

Если у вас есть tsc> = 2.7.1, то вы либо ищете опции компилятора

--strict

Включить все параметры строгой проверки типов. Включение --strict включает --noImplicitAny, --noImplicitThis, --alwaysStrict, --strictNullChecks, --strictFunctionTypes и --strictPropertyInitialization.

, поскольку он содержит все строгие наборы правил.

Или, более конкретно, для

--strictPropertyInitialization

как тот, который предназначен для вашего варианта использования:

Убедитесь, что неопределенные свойства класса инициализированы в конструктор. Эта опция требует, чтобы --strictNullChecks был включен в для вступления в силу.

С этим параметром tsc теперь выдаст:

src/SomeClass.ts:2:22 - error TS2564: Property 'item' has no initializer and is not definitely assigned in the constructor.

2     private readonly item: string;
                       ~~~~
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...