gpt4 book ai didi

javascript - 为命名空间上公开的方法创建类型定义

转载 作者:行者123 更新时间:2023-12-03 07:25:57 26 4
gpt4 key购买 nike

我正在将现有的 JavaScript 应用程序转换为 Typescript。我从以下内容开始:

// file1.js
(function(ns) {
ns.bar = function() { };
}(window.MyNamespace || {}));
// file2.js
(function(ns) {
ns.Item = function() {
this.doStuff = function() { ns.bar(); };
}
}(window.MyNamespace || {}));

现在我正在转换file2.js到 typescript :

module MyNamespace {
class Item {
doStuff() {
MyNamespace.bar(); // This is obviously a problem
}
}
}

调用 bar 时出现问题。我明白转换 file1.js转换为 TypeScript 会让事情变得容易得多,但该文件实际上相当大,所以我想在下一个冲刺中进行转换并获得中间情况。

我该如何解决这个问题?我如何告诉 tsc bar是模块本身的函数吗?

我已经尝试过declare var bar: () => void;里面module及其变体,但到目前为止还没有发挥作用。

我知道我可以考虑将这些“命名空间函数”转换为类上的静态方法,但这需要重写 file1.js 现在,我(还)不想要。

我有一个解决方法,如下所示:

module MyNamespace {
var ns: any = MyNamespace;

class Item {
doStuff() {
ns.bar();
}
}
}

但这感觉有点不对劲,至少是因为它需要在我的 class 内部进行更改。 ,而我更喜欢在 file2.ts 之间架起一座桥梁。和file1.ts与决赛分开file2.ts东西。

本质上,我觉得我正在写一个.d.ts我的原始文件 file1.js功能将使 file2.ts 现在,以转换后保持不变的方式 file1.js.ts .

有什么建议吗?如何为我的未转换 file1.js 创建打字?

最佳答案

在模块旁边添加一条声明语句,如下所示:

declare module MyNamespace {
var bar: () => void;
}

module MyNamespace {
class Item {
doStuff() {
MyNamespace.bar(); // This will compile!
}
}
}

将 file1.js 转换为 Typescript 后,您可以(应该)删除 bar 方法的临时声明

关于javascript - 为命名空间上公开的方法创建类型定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36004871/

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