当类型定义未声明模块时,如何在 TypeScript 中导入库?

文卡斯·斯托尼斯

PeerJS 有类型定义,但它们不作为模块导出。它们是某个命名空间下的类型声明。

我正进入(状态: [ts] File 'c:/Users/Vincas/Desktop/language-exchange/node_modules/@types/peerjs/index.d.ts' is not a module.

尝试导入时:import Peer from 'peerjs'这会尝试从类型定义导入,而不是从模块本身导入,如何从此处的模块导入?

来自绝对类型的文件在这里:https : //github.com/DefinitelyTyped/DefinitelyTyped/blob/354cec620daccfa0ad167ba046651fb5fef69e8a/types/peerjs/index.d.ts

我暂时是这样工作的:

const PeerJS: typeof Peer = require('peerjs')
const peerjs = new PeerJS({ key: '**********' })

但这远不如:import * as Peer from 'peerjs或类似的东西......有没有办法避免定义全局函数和全局命名空间?对我来说,这看起来是一种可怕的做法。

E_net4 山寨

@types/peerjs注册的类型声明被指定为全局变量。也就是说,它们将命名空间PeerJs和变量的存在Peer声明为全局声明(也称为“环境”)。

declare var Peer: {
   // ...
}

这表明它们应该与可分发库文件“dist/peer.js”一起使用,而不是与模块一起使用。如果要将这个文件直接包含在页面中,编译器应该能够知道这些全局变量是可用的。

但确实,您想改用该模块。不幸的是,相同的声明是不兼容的,必须重新编写以确保一致性。存储库中的一个旧问题未解决 ( #176 ),您似乎不久前创建了#386您的直觉似乎是正确的:理想情况下,必须有人修改这些声明。在这种情况下,由于从库中导出的对象是一个类,我们应该遵循类模块模式。而不是declare var Peer,我们可以有这样的东西:

export = Peer;
declare class Peer {
    constructor(id: string, options?: Peer.PeerJSOption);
    constructor(options: Peer.PeerJSOption);
    // remaining methods here ...
};

declare namespace Peer {
    export interface PeerJSOption {
        // ...
    }
    // ...
}

附加的接口类型放在同名的命名空间中,以便正确导出所有内容。

我亲手完成了这个任务:这个分支中一个新文件“index.d.ts”被添加到存储库中,还有一些额外的 package.json 字段这使得声明只需安装主要依赖项即可工作,不需要其他包(特别是,您不应添加“@types/peerjs”)。

你甚至可以自己尝试一下:

包.json:

{
  "name": "test-peerjs-ts",
  "version": "0.1.0",
  "main": "index.ts",
  "dependencies": {
    "peerjs": "git+https://github.com/Enet4/peerjs.git#typescript-types"
  }
}

索引.ts:

import Peer = require('peerjs');

let peer = new Peer("id");
let peer2 = new Peer("id", {});

type DataConn = Peer.DataConnection;

您可能只会从类型中看到一堆 TypeScript 错误webrtc,其中显然包含在最新的 TypeScript 编译器中已经可用的定义。尽管如此,编译过程仍会成功并产生良好的 JavaScript 代码:

"use strict";
exports.__esModule = true;
var Peer = require("peerjs");
var peer = new Peer("id");
var peer2 = new Peer("id", {});

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章