为许多导入模式和 Intellisense 编写 Typescript

Writing Typescript for Many Import Patterns and Intellisense

我正在尝试将某些 javascript 模块更新为打字稿,但无法保持兼容性。我在 javascript 中有一些使用 commonjs 模式 const fn = require('mod'); 的旧项目仍然依赖于此模块。我已经尝试按照 typescript 指南处理如此多的导入:

https://www.typescriptlang.org/docs/handbook/declaration-files/templates/module-d-ts.html#handling-many-consuming-import

// src/mod.ts
type FnResult = Promise<void>;
function fn(): FnResult {
    return Promise.resolve();
}

fn.fn = fn;
fn.default = fn;
module.exports = fn;

这在为较旧的 javascript 项目和大多数较新的项目编译时效果很好。 tsc 构建以下内容:

// lib/mod.js
"use strict";
function fn() {
    return Promise.resolve();
}
fn.fn = fn;
fn.default = fn;
module.exports = fn;

// lib/mod.d.ts
declare type FnResult = Promise<void>;
declare function fn(): FnResult;
declare namespace fn {
    export var fn: typeof globalThis.fn;
    var _a: typeof globalThis.fn;
    export { _a as default };
}

然而,当在打字稿中使用 import fn from './mod'; 时,包括模块自己的单元测试,我得到 File '.../mod.ts' is not a module.ts(2306) 作为智能感知错误。这种“技术”是否还有更多内容我没有将其定义为模块但仍然确保兼容性?

看来我可以使用 babel-plugin-replace-ts-export-assignment 在我的 babel 配置中解决这个问题。附加我的 .babelrc 喜欢:

"plugins": [
  "babel-plugin-replace-ts-export-assignment"
]

我的 app.ts 看起来像:

fn.fn = fn;
fn.default = fn;
export = fn;

它现在可以针对 javascript commonjs 模式正确构建,而且我的打字稿单元测试不会抛出智能感知错误。