如何防止使用TypeScript在构造函数中取消定义成员?

时间:2018-11-06 13:06:07

标签: typescript tsc tsconfig compiler-options

我通过编写这样的类引入了一个错误:

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。这段代码可以成功编译。

我当前项目的代码风格是通过tslint的no-parameter-properties规则来阻止使用简写构造函数,因此我不能这样做:

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

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

由于tsconfig的strictNullChecks设置,我期望tsc会引发错误。

有没有一种方法可以使打字稿检测到该错误并将其编译标记为错误?

这是我当前的tsconfig.json编译器选项:

  "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 :(得分:1)

如果tsc> = 2.7.1,则您正在寻找compiler options

--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;
                       ~~~~