如何防止使用 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 中的函数调用上从“任何”进行隐式转换