gpt4 book ai didi

TypeScript:从 node_modules 导入外部模块

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

例如有一个 npm 模块 one-two-three。它包含 TS 文件 index.ts(主要)和 functions.ts

函数.ts:

export interface IPoint {
x: number;
y: number;
}

export function sum(a: IPoint, b: IPoint): IPoint {
return {
x: a.x + b.x,
y: a.y + b.y
};
}

索引.ts:

import functions = require("./functions");

export var sum: typeof functions.sum = functions.sum;

编译:

tsc --module commonjs --declaration index.ts

创建文件:index.jsindex.d.tsfunctions.jsfunctions.d.ts 。好的。

还有另一个库依赖于one-two-three

npm install --save one-two-three

我想包含依赖并使用它和来自 functions.ts 的接口(interface)。

import mo = require("one-two-three");

错误 找不到外部模块“一二三”

/// <reference path="node_modules/one-two-three/index.d.ts" />
import mo = require("one-two-three");

没有反应。

import mo = require("./node_modules/one-two-three");

失败。

declare var require;

var mo = require("one-two-three");

编译成功。但是没有类型检查。可以写:mo.unknownFunction() 它会被编译。不能使用接口(interface)。

如何使上面的描述正确?

更新

我已经实现了预期的行为。编辑 d.ts 文件。

函数.d.ts:

declare module "one-two-three.functions" {
export interface IPoint {
x: number;
y: number;
}
export function sum(a: IPoint, b: IPoint): IPoint;
}

index.d.ts:

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

declare module "one-two-three" {
import functions = require("one-two-three.functions");
export var sum: typeof functions.sum;
}

使用它:

/// <reference path="node_modules/one-two-three/index.d.ts" />
/// <reference path="node_modules/one-two-three/functions.d.ts" />

import oneTwoThree = require("one-two-three");
import functions = require("one-two-three.functions");
import IPoint = functions.IPoint;

function delta(a: IPoint, b: IPoint): number {
var dx: number = a.x - b.x,
dy: number = a.y - b.y;
return Math.sqrt(dx * dx + dy * dy);
}

var point1: IPoint = {x: 10, y: 20},
point2: IPoint = {x: 5, y: 5};

console.log(oneTwoThree.sum(point1, point2));
console.log(delta(point1, point2));

成功。但我们必须履行双重职责。编写代码,单独描述接口(interface)。

有没有办法生成正确的 d.ts?问题是 d.ts 应该用内部语法 (module {}) 描述模块。但是源文件是 CommonJS 模块。它没有 module 部分。

最佳答案

/// <reference path="node_modules/one-two-three/index.d.ts" />
import mo = require("one-two-three");

No reaction.

它应该可以工作。

一个文件 .d.ts在 TypeScript 中就像一个文件 .h在 C 中。从另一个项目或子项目导入依赖项时使用它是正常的。

如果文件your-project/node_modules/one-two-three/index.d.ts写的不对,建议复制到your-project/one-two-three.d.ts , 然后修复副本。使用模块名称作为文件名使得 /// <reference选修的。只写:

import mo = require("one-two-three");

关于TypeScript:从 node_modules 导入外部模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29653735/

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