gpt4 book ai didi

node.js - 由于 TypeScript 中导入时的拼写错误,静态数据被初始化了两次

转载 作者:太空宇宙 更新时间:2023-11-04 01:23:07 38 4
gpt4 key购买 nike

我有一个关于 TypeScript 导入的新手问题。我尝试创建一个类,在静态变量中保存一些数据,并在 getInstance() 方法中延迟初始化数据。

myStaticClass.ts:

class MyData {
x = 1;
}

export class MyStaticClass {
private static data: MyData;

static getInstance() {
if (MyStaticClass.data == null) {
console.log('data is null, initialising');
MyStaticClass.data = new MyData();
}
return MyStaticClass.data;
}
}

我在另外 2 个类中导入了这个类:

a.ts

import { MyStaticClass } from './MyStaticClass';
// NOTE the typo above - uppercase file name
export class A {
logX() {
console.log(MyStaticClass.getInstance().x);
}
}

索引.ts

import { MyStaticClass } from './myStaticClass';
import { A } from './a';

console.log(MyStaticClass.getInstance().x);
new A().logX();

令我惊讶的是,ts-node index.ts 的输出是

data is null, initialising
1
data is null, initialising
1

如果我更正导入,输出将如预期 - 数据仅初始化一次。

我还检查了我是否获得了一种拼写变体的初始化(添加了第三类和另一个大写字母)

谁能解释一下为什么会出现这种行为?(此外,我可以使用哪些工具/调试语句来识别正在发生的情况?)我可以强制 TypeScript 将其标记为错误吗?

我使用的是 MacO、TS 3.6.3、node-ts 8.4.1

最佳答案

虽然在 Windows 上,两个大小写不同的文件名始终指向同一个文件,但在其他平台上则不然。这意味着具有不同文件名的导入被视为不同的模块,这是设计使然,不被视为问题 ( see here for node discussion )

简单的解决方案是在导入模块时强制使用一致的文件大小写。 Typescript 确实有一个编译器选项来强制此命名 forceConstantCasingInFileNames ( See docs )。此选项应该可以防止此类问题。

关于node.js - 由于 TypeScript 中导入时的拼写错误,静态数据被初始化了两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58499199/

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