Например, модуль npm one-two-three
. Он содержит файлы TS index.ts
(основной) и functions.ts
.Тип: импорт внешнего модуля из node_modules
functions.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
};
}
index.ts:
import functions = require("./functions");
export var sum: typeof functions.sum = functions.sum;
компиляции:
tsc --module commonjs --declaration index.ts
файлы: index.js
, index.d.ts
, functions.js
и functions.d.ts
. Хорошо.
Существует еще одна библиотека, которая зависит от one-two-three
.
npm install --save one-two-three
Я хочу, чтобы включить зависимость и использовать его и интерфейс от functions.ts
.
import mo = require("one-two-three");
Ошибка Cannot find external module '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");
Fail.
declare var require;
var mo = require("one-two-three");
Он компилируется успешно. Но нет проверки типа. Можно написать: mo.unknownFunction()
и он будет скомпилирован. Нельзя использовать интерфейсы.
Как сделать описанное выше правильным?
ОБНОВЛЕНИЕ
я достиг желаемого поведения следующим образом. Редактирование файлов d.ts.
functions.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));
успеха. Но мы должны делать двойной долг. Запишите код и отдельно описывайте интерфейс.
Есть ли способ генерации правильных d.ts? Проблема в том, что d.ts должен описывать модуль с внутренним синтаксисом (module {}
). Но исходный файл - это модуль CommonJS. У него нет раздела module
.
Но не работает :( Как я понимаю, d.ts файл должен иметь вид последующих: модуль «один-два-три» {...} Но компилировать как - -module commonjs и содержит только функции без оператора 'module'. –
Можете ли вы исправить файл' .d.ts'? – Paleo
Да, я могу это сделать, но я не хочу. Я добавил ОБНОВЛЕНИЕ на вопрос. –