Использовать класс из модуля CommonJS в Typescript

У меня есть пакет npm с файлом, подобным этому:

'use strict'

module.exports = class TModel {
  constructor (app) {
    this.app = app
  }

  static schema () {

  }
}

Что я хочу использовать в файле Typescript, например:

import Model from 't-model';

export class Book extends Model {
    static schema() : any {
        return {
            title: {
                type: 'string'
            }
        }
    }
}

Но это не работает. PHPStorm выдает ошибку:

Не удается разрешить файл

И компиляция с tsc дает мне ошибку:

ошибка TS2307: не удается найти модуль t-model

Если использовать 't-model/index' вместо 't-model', PHPStorm перестает выдавать мне ошибку, но tsc по-прежнему выдает ту же ошибку.

Я пытаюсь объединить пакеты, которые я сделал бы для API серверной части и интерфейса, который использует Typescript. Есть ли способ сделать это?


person BeaverusIV    schedule 31.01.2016    source источник
comment
Возможно, вы могли бы добавить то, что не работает. Вы получаете сообщение об ошибке ... что?   -  person Lodewijk Bogaards    schedule 01.02.2016


Ответы (1)


есть пакет npm с файлом, подобным этому:

Если этот файл машинописный

вместо того:

module.exports = class TModel {

Сделайте export class TModel и позвольте TypeScript сгенерировать module.exports (скомпилировать с module: commonjs). Таким образом, TypeScript понимает экспорт

Подробнее об этом: https://basarat.gitbooks.io/typescript/content/docs/project/modules.html

Если файл javascript

Вам необходимо объявить это:

declare module 't-model' {
   class TModel // .....
   export = TModel;
}

Подробнее об этом: https://basarat.gitbooks.io/typescript/content/docs/types/migrating.html

person basarat    schedule 31.01.2016
comment
Это пакет npm, поэтому я не могу контролировать исходный код. Должен ли я разветвлять каждый пакет npm, который я хочу использовать в проекте Typescript? - person BeaverusIV; 01.02.2016
comment
Ты. Вам просто нужно объявить типы. Например, ознакомьтесь с определениями популярных проектов в gitter.im/DefinentyTyped/DefinentyTyped. - person basarat; 01.02.2016
comment
Итак, я создал файл .d.ts, но все равно получаю сообщение об ошибке error TS2507: Type 'any' is not a constructor function type., что бы я ни делал. - person BeaverusIV; 01.02.2016
comment
Каким будет ваше объявление, учитывая модуль класса TModel выше? Я бы посмотрел на DefinentyTyped, но я не знаю ни одной библиотеки, которая экспортирует класс. - person BeaverusIV; 01.02.2016
comment
@BeaverusIV вы бы использовали export =. Я тоже обновил ответ - person basarat; 01.02.2016