TypeScript: как определить пользовательскую типизацию для установленного пакета npm?

Мне нравится использовать rx-node в TypeScript

import RxNode from 'rx-node';

Я установил rx-node с помощью npm

$ npm install rx-node --save

Я искал определения типов, но безрезультатно

$ typings search rx-node
No results found for search

Как я могу определить пользовательские определения типов для установленного модуля npm rx-node? Где мне хранить файл определения типа? Как настроить TypeScript (tsconfig.json и typings.json)?

Изменить: Спасибо Алексею Л. и David Bohunek Мне удалось определить rx-node.d.ts, который выглядит так

declare module "rx-node" {
  import {Observable} from '@reactivex/rxjs';
  import {ReadLine} from "readline";

  function fromReadLineStream(stream: ReadLine): Observable<string>
}

Я установил @ reactivex / rxjs

npm install --save @reactivex/rxjs

Так как я получил ошибку

node_modules\@reactivex\rxjs\dist\cjs\Observable.d.ts (10,66): Cannot find name 'Promise'. (2304)

Я изменил цель в tsconfig.json на es6.


person maiermic    schedule 05.06.2016    source источник


Ответы (3)


Остерегайтесь, это старый вопрос (2016 г.) относительно управления определениями с использованием типов, который устарел в пользу их установки. прямо через npm


Вы можете добавлять собственные определения в typings.json. Например, имея следующую структуру папок:

/typings
    /custom
        rx-node.d.ts
    /global
        ...

где rx-node.d.ts - ваш файл пользовательской типизации. Например:

declare module RxNode {
    export interface ...
}

Затем установите с помощью команды

typings install file:typings/custom/rx-node.d.ts --save --global

Или вручную: в typings.json добавьте ссылку на этот файл типов:

{
    "name": "TestName",
    "version": false,
    "globalDependencies": {
        "rx-node": "file:typings/custom/rx-node.d.ts"
    }
}

И запустите typings install

person Aleksey L.    schedule 05.06.2016
comment
Запуск typings install копирует typings/custom/rx-node.d.ts в typings/globals/rx-node/index.d.ts. Если я изменю определение типа, мне придется снова запустить typings install, чтобы скопировать изменения. В чем преимущество этого подхода по сравнению с указанием rx-node.d.ts вручную в index.d.ts? - person maiermic; 05.06.2016
comment
Лично я предпочитаю не редактировать автоматически сгенерированные файлы (и добавлять правило игнорирования в систему управления версиями). Также после определения типизации они не изменятся до тех пор, пока не будет изменена исходная библиотека. И как только появится официальная версия, ее можно будет легко заменить. - person Aleksey L.; 05.06.2016
comment
Я предполагаю, что этот подход теперь изменился с TypeScript 2.x, поскольку папка typings является избыточной, и все типы устанавливаются через npm в node_modules / @ types / ...? Есть ли рекомендуемый подход для пользовательского ввода отсутствующих определений? - person Squiggle; 18.11.2016
comment
@Squiggle, да и нет. Вы по-прежнему можете использовать типизацию с TS 2. Если вы решите перейти к @types - пользовательские локальные типизации могут быть включены с параметром компилятора "typeRoots" (в случае, если вы хотите хранить их отдельно от других источников) - person Aleksey L.; 19.11.2016

Создайте новый файл, назовите его rx-node.d.ts и убедитесь, что он указан в вашем tsconfig.json либо напрямую, либо из другого файла, например typings/index.d.ts. Тогда вы можете начать примерно так:

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

declare namespace RxNode  {

    export interface Emitter<T>{

    }

    export function toEventEmitter<T>(observable: Rx.Observable<T>, eventName: string): Emitter<T>;
}

Этот вопрос / ответ может быть полезным: Как записать файл d.ts из существующего файла .js?

Если вы создаете красивый, высококачественный файл определения типизации, внесите свой вклад в https://github.com/DefinentyTyped/DefinentyTyped < / а>

person David Bohunek    schedule 05.06.2016

Для проектов ReactJS, использующих приложение create-response-app (сценарии реакции), вы можете добавить объявление модуля в src/react-app-env.d.ts для своего нетипизированного пакета.

declare module "not-typed";

Примечание: в будущем расположение этого файла может измениться, см. эту проблему.

person Greg K    schedule 11.06.2020