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

Posted

技术标签:

【中文标题】如何防止使用 TypeScript 在构造函数中未定义成员?【英文标题】:How to prevent a member from being undefined within a constructor using TypeScript? 【发布时间】:2018-11-06 13:06:06 【问题描述】:

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

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 会抛出错误。

有没有办法让 typescript 检测到这个 bug 并将其编译标记为错误?

这是我目前的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】:

如果您的 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;
                       ~~~~

【讨论】:

您可能还对--noUnusedParameters感兴趣

以上是关于如何防止使用 TypeScript 在构造函数中未定义成员?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用具有构造函数参数的 TypeScript 类定义 AngularJS 工厂

如何防止在 Typescript 中的函数调用上从“任何”进行隐式转换

如何绕过 ESLint 调用 Typescript 中未定义的 Geolocation 接口?

如何在 Typescript 中用静态变量表达构造函数?

Typescript如何向对象构造函数添加属性?

defrecord 构造函数中未强制执行类型提示