gpt4 book ai didi

javascript - 编写 .d.ts 文件以便我可以与 JavaScript 和 TypeScript 共享常量?

转载 作者:行者123 更新时间:2023-11-30 09:27:51 25 4
gpt4 key购买 nike

我正在开发一个 node.js 项目,由于历史原因,该项目同时涉及 TypeScript 和 JavaScript。我想设置一些可以在两种语言中使用的项目范围的常量。显而易见:编写一个包含常量的 .js 文件,以及一个包含供 TypeScript 使用的类型的 .d.ts 文件。但没有:在这个问题(和 RTFMing)上苦苦挣扎了几个小时,但我一无所获。

这是我对常量文件的第一次尝试:

// constants.js
const MY_CONST_1 = 1;
exports.MY_CONST_1 = MY_CONST_1;

...以及使用它的 JavaScript:

// consumer.js
let constants = require('./constants');
let one = constants.MY_CONST_1;

效果很好,但是当我在 TypeScript 中尝试显而易见的事情时:

// consumer.ts
import * as constants from './constants';
let one: number = constants.MY_CONST_1;

没有:错误 TS2307:找不到模块“./constants”。 所以,必须在与 constants.js 文件,对吧?听起来很简单,但是六次不同的尝试都完全失败了。无论我做什么,Typescript 都会提示 error TS2306: File '/Users/griscom/Documents/Work/test/constants.d.ts' is not a module

那么,一个成功的constants.d.ts 文件应该是什么样的?或者,如果我必须在 constants.js 中进行更改才能使其正常工作,它们会是什么?

附言这是我的 tsconfig.json 文件:

{
"compilerOptions": {
"target": "es5",
"module": "commonjs",
"moduleResolution": "node",
"sourceMap": true,
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"removeComments": false,
"noImplicitAny": true,
"noImplicitReturns": true
}
}

(这似乎是一个简单而明显的需求;令人沮丧的是这个过程是多么不透明。)

最佳答案

选项一:allowJs

尝试使用编译器选项 allowJs: true。这将允许您从 ./constants 的原始导入工作,即使它是一个 .js 文件,而无需创建单独的 .d.ts文件。 TypeScript 将理解 .js 文件中的可推断类型,例如,您将针对 MY_CONST_1 作为数字进行类型检查。

正如您在评论中所说,这需要将源文件与输出文件分开,因为它无法在与 JS 源文件相同的位置输出 JS 文件。

选项2:constants.d.ts声明文件

鉴于您的源文件如下所示:

// constants.js
export const MY_CONST_1 = 1;

您可以编写如下所示的 constants.d.ts 文件:

// constants.d.ts
export const MY_CONST_1: number;

在之前的尝试中,您使用的是声明 module,它用于声明外部模块的类型(例如来自 node_modules)。在这种情况下,只需将 constants.d.ts 文件放在与 constants.js 相同的目录中并使用 export 即可告诉 TS 这是一个导出该值的 JS 模块:

import { MY_CONST_1 } from "./constants";
import * as constants from "./constants";

需要牢记的重要一点是,.d.ts 文件不会根据 .js 文件进行检查,以确保它实际上是没错,就在你身上。因此,如果您对 .js 文件进行更改,则必须确保相应且正确地更新 .d.ts 文件。编译错误或缺少编译错误并不意味着它是正确的或不正确的。这是 allowJs 存在的原因之一,因为它避免了此类泄漏。

关于javascript - 编写 .d.ts 文件以便我可以与 JavaScript 和 TypeScript 共享常量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48305876/

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