gpt4 book ai didi

typescript 错误 : Property is used before being assigned

转载 作者:行者123 更新时间:2023-12-03 22:14:46 24 4
gpt4 key购买 nike

typescript 显示 [ts] 属性 'logger' 在分配之前使用 在 VSCode 中。错误发生在以下代码中 this.logger.logInfo(Important, ... .我很清楚地在构造函数的第二行设置了这个属性,所以......?

如果我使用 self var 显示在代码 (self.logger.logInfo...) 中,TS 错误消失了,但这不是必需的。

感谢您分享您的专业知识:-)

// app/data/mongo/_base.data.mongo.ts 

import { MongoClient, ObjectId } from 'mongodb';
import { IBaseModel } from '../../model/_base.model';
import { Logger, Important, NotImportant } from '../../util/logger';

export default class BaseData {

constructor(params: any) {
this.collectionName = params.collectionName;
this.logger = new Logger(this.collectionName);
if (this.db) {
this.collection = this.db.getCollection(this.collectionName);
} else {
BaseData.userId = params.user.id;
BaseData.userHandle = params.user.handle;
this.dbServer = params.dbServer;
this.dbPort = params.dbPort || '27017';
this.dbName = params.dbName;
const self = this; // This is a Typescript BUG!
(async () => {
const url = `mongodb://${this.dbServer}:${this.dbPort}`;
this.db = await MongoClient.connect(url, { "useNewUrlParser": true });
this.collection = this.db.collection(this.collectionName);
this.logger.logInfo(Important, 'contructor', `MongoDb connection (${url}) success!`);
})();
}
}

static userId: string;
static userHandle: string;

protected logger: Logger;
protected collectionName: string = '';
protected client: any;
protected collection: any;
protected db: any;
protected dbServer: string = '';
protected dbPort: string = '';
protected dbName: string = '';

最佳答案

这是一些重现该问题的自包含代码:

// Turn on --strictNullChecks and --strictPropertyInitialization
class Foo {
prop: string;
constructor() {
this.prop = "assigned";
(async () => {
this.prop; // error, used before assigned
})();
}
}

View on the Playground (记得打开 --strictNullChecks--strictPropertyInitialization 编译器选项)。

这很可能是 TypeScript 的设计限制,如果不是一个成熟的错误。事实是,自动化控制流分析是 hard to do "right" .由于编译器通常不可能准确地确定程序中每个点的每个变量可能处于哪些状态,因此它必须使用启发式方法,这往往会导致误报( Uncaught Error )和误报( Uncaught Error )。错误)。这对我来说似乎是一个误报,因为异步函数肯定是在 this.prop 之后调用的。已经设置好了。 A similar issue之前已经通过同步立即调用函数表达式提出和解决。

我认为需要有人更了解 TypeScript 如何进行控制流分析的细节才能在这里权威地发言,但我猜测这种特殊情况并没有被预期或遇到足以处理它。如果你认为你有一个引人注目的用例,你可能想要 file an issue in GitHub ,假设没有人对这个问题提供更令人满意的答案。

同时,如果您有解决方法,例如分配 const self = this然后访问 self.prop ,或等效访问 (this as this).prop ,那么我想你应该使用它。而且总是有所有变通方法的大锤, //@ts-ignore comment :
class Foo {
prop: string;
constructor() {
this.prop = "assigned";
(async () => {
// @ts-ignore: this.prop is really assigned before being used
this.prop;
})();
}
}

哦,对不起,我没有更好的消息。希望在任何情况下都有帮助。祝你好运!

关于 typescript 错误 : Property is used before being assigned,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51675833/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com