gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 21:29:25 25 4
gpt4 key购买 nike

PeerJS 有类型定义,但它们不作为模块导出。它们是某些 namespace 下的类型声明。

我得到:[ts] 文件 'c:/Users/Vincas/Desktop/language-exchange/node_modules/@types/peerjs/index.d.ts' 不是模块。

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

DefinitelyTyped 的文件在这里: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 或类似的东西......没有办法避免定义全局函数和全局 namespace 吗?对我来说,这看起来像是一种糟糕的做法。

最佳答案

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

declare var Peer: {
// ...
}

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

但实际上,您想改用模块。不幸的是,相同的声明是不兼容的,必须重写以保持一致性。存储库上的一个旧问题未解决( #176 ),您似乎已经创建了 #386不久前。您的直觉似乎是正确的:理想情况下,必须有人调整这些声明。在这种情况下,由于从库中导出的对象是一个类,因此我们应该遵循 class module图案。除了 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 {
// ...
}
// ...
}

额外的接口(interface)类型被放在同名的命名空间中,以便正确导出所有内容。

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

您甚至可以自己尝试:

package.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;

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

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

关于typescript - 当其类型定义未声明模块时如何在 TypeScript 中导入库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44737092/

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