javascript - 将外部 javascript 库导入 Typescript 以与 Node 一起使用

标签 javascript node.js typescript tsc

前段时间我们开始使用 Typescript + Electron 编写基于浏览器的桌面应用程序。然而,加载外部 Javascript 库通常是一个瓶颈。我们尽可能多地使用 typings,这为我们完成了大部分工作,但一些 Javascript 库(目前)还不能通过这种方式使用。 要开始编写新的声明文件,我首先想尝试使用 DefinitelyTyped repository 中已有的声明文件。没有类型。这是 abs 库的一个简单示例:

tsconfig.json:

{
"compilerOptions": {
    "module": "commonjs",
    "moduleResolution": "node",
    "noImplicitAny": true,
    "removeComments": true,
    "preserveConstEnums": true,
    "sourceMap": true,
    "types": [
        "node"
    ]
},
"files": [
    "abs.d.ts",
    "abs-tests.ts"
]
}

abs.d.ts:

// Type definitions for abs 1.1.0
// Project: https://github.com/IonicaBizau/node-abs
// Definitions by: Aya Morisawa <https://github.com/AyaMorisawa>
// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped

declare module "abs" {
    /**
    * Compute the absolute path of an input.
    * @param input The input path.
    */
    function Abs(input: string): string;

    export default Abs;
}

abs-tests.ts:

/// <reference path="./abs.d.ts" />

import Abs from 'abs';

const x: string = Abs('/foo');

用 Node 转录并运行输出的Javascript文件:

npm install @types/node --save-dev;
npm install abs;
tsc -p tsconfig.json;
node abs-tests.js;

转录的 Javascript 文件:

"use strict";
var abs_1 = require('abs');
var x = abs_1["default"]('/foo');
//# sourceMappingURL=abs-tests.js.map

Node 输出:

<my-path>/abs-tests.js:3
var x = abs_1["default"]('/foo');
            ^

TypeError: abs_1.default is not a function
at Object.<anonymous> (<my-path>/abs-tests.js:3:25)
at Module._compile (module.js:556:32)
at Object.Module._extensions..js (module.js:565:10)
at Module.load (module.js:473:32)
at tryModuleLoad (module.js:432:12)
at Function.Module._load (module.js:424:3)
at Module.runMain (module.js:590:10)
at run (bootstrap_node.js:394:7)
at startup (bootstrap_node.js:149:9)
at bootstrap_node.js:509:3

这只是许多不同库失败的测试之一。这里出了什么问题?是否可以解释如何正确转录带有外部 Javascript 库的 Typescript 代码,以便它可以在 Node 中使用?

最佳答案

基本上,export default不适用于此用例。

Typescript 有特殊的 export =import = require() syntax用于处理 Node 模块。

export =可以在 Node 模块将单个对象或函数分配给其 exports 时使用目的。这就是abs模块在其 index.js 中执行:

module.exports = abs;

它的类型声明可以这样写:

declare module "abs" {
    /**
    * Compute the absolute path of an input.
    * @param input The input path.
    */
    function Abs(input: string): string;

    export = Abs;
}

像这样使用

import Abs = require('abs');

const x: string = Abs('/foo');

(旁注:如果它包含在 tsconfig.json 的 /// <reference 中,您甚至不需要 files abs.d.ts)

如果出于某种原因必须将其用作 export default ,你将无法单独使用 typescript 来完成它——你需要将它编译为 es6 并使用另一个像 Babel 这样支持 export default 的转译器。与 Node 的兼容性。您可以在此 typescript issue 中找到详细信息还有这个blog post .

关于javascript - 将外部 javascript 库导入 Typescript 以与 Node 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40385838/

相关文章:

javascript - 使用 Node 在rehindb中插入错误

javascript - 每个循环内的 Ajax 调用

javascript - 如何使用 VM 在 nodejs 中安全地运行用户代码而不容易受到攻击

node.js - BotFrameworkAdapter 缺少事件类型 - 本地调试 Messenger

javascript - 我怎样才能通过javascript获取文件并为ajax发送

javascript - 加载外部JS文件的进度

mysql - 在node-mysql中执行存储过程后返回的rows对象

javascript - Node.js 新手;需要帮助将 npm 模块导入我的前端 vanilla JS 项目

javascript - 从 JSON 模式创建 JSON 实例

node.js - 如何使用 nestjs 和 socket.io 创建房间