2015-04-15 6 views
6

Например, модуль 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.

ответ

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

Никакой реакции.

Должно работать.

Файл .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"); 
+0

Но не работает :( Как я понимаю, d.ts файл должен иметь вид последующих: модуль «один-два-три» {...} Но компилировать как - -module commonjs и содержит только функции без оператора 'module'. –

+0

Можете ли вы исправить файл' .d.ts'? – Paleo

+0

Да, я могу это сделать, но я не хочу. Я добавил ОБНОВЛЕНИЕ на вопрос. –

Смежные вопросы