Как я могу написать и использовать файлы пользовательских объявлений, которых нет в @types или DefinitelyTyped?

Я использую пакет npm под названием foo, которого нет в DefinitelyTyped. Другими словами, @types/foo не существует (или потенциально устарело!)

Я хотел бы по-прежнему иметь возможность использовать его с более строгими настройками, такими как noImplicitAny, поэтому мне нужно самому написать файлы пользовательских определений. В конце концов я хотел бы отправить запрос на включение в DefinitelyTyped, чтобы этот файл мог быть полезен другим за пределами моего проекта.

Есть простые решения, такие как создание глобального файла с именем ./src/types.d.ts, где я могу написать следующее

declare module "foo" {
    export function hello(): void;
    export function world(): void;
}

Но если я буду использовать этот синтаксис, мне потенциально придется переписать свой модуль, когда я отправлю его в DefinitelyTyped.

Как я могу структурировать свой проект, чтобы я мог легко создавать и затем отправлять локальные файлы .d.ts в DefinitelyTyped?


person Daniel Rosenwasser    schedule 28.06.2017    source источник


Ответы (1)


Я буду делать это шаг за шагом с пояснениями, так что это может показаться длинным, но следование приведенным инструкциям займет всего несколько минут. Фактически, вот короткая версия, которую вы можете просто запустить в bash или PowerShell!

mkdir -p ./local-types/foo
cd ./local-types/foo
npm init --scope types --yes
echo "export function hello(): void; export function world(): void" > ./index.d.ts
cd ../..
npm install ./local-types/foo

Фон

Представим следующую структуру проекта:

proj/
├─ tsconfig.json
└─ src/
   └─ ...

Создайте папку локальных типов в корне вашего проекта.

Неважно, как он называется, но мы назовем его local-types. Вы можете изменить его на все, что захотите, как только хорошо поймете, что мы здесь сделали.

proj/
├─ tsconfig.json
├─ local-types/
└─ src/
   └─ ...

В большинстве случаев, кроме этого примера, я мог бы просто назвать это types.

Создайте новый пакет в каталоге локальных типов.

Поскольку вы пытаетесь импортировать модуль с именем foo, мы создадим папку с именем foo с расширением index.d.ts.

// local-types/foo/index.d.ts

export function hello(): void;

export function world(): void;

Мы также хотим сделать это пакетом npm, создав package.json:

cd local-types/foo
npm init --scope types --yes

На этом этапе ваш проект должен выглядеть так:

proj/
├─ tsconfig.json
├─ local-types/
|  └─ foo/
|     └─ index.d.ts
|     └─ package.json
└─ src/
   └─ ...

Теперь вы сможете просто импортировать foo из любого файла в пределах src.

import { hello, world } from "foo";

hello();
world();

Имейте в виду, что у вас может не быть пакета с одной точкой входа с index.d.ts. В этом случае вы захотите имитировать структуру пакета, как она была опубликована в npm.

Добавьте пакет в качестве зависимости (или, возможно, devDependency)

Если вы пишете библиотеку, вы, вероятно, захотите использовать это в своих зависимостях, но приложения могут захотеть использовать devDependencies. Просто добавьте file:./local-types/foo в качестве версии для @types/foo:

"dependencies": {
    "@types/foo": "file:local-types/foo"
}

Опубликовать в DefinitelyTyped

Являются ли ваши файлы .d.ts полными и полезными? Подумайте о том, чтобы написать несколько тестов и отправить запрос на извлечение в DefinitelyTyped, чтобы другие могли извлечь выгоду из проделанной вами работы!

Если вы сможете без проблем импортировать эти пакеты во время выполнения, у вас уже будет соответствующая структура пакета.

О чем следует помнить

person Daniel Rosenwasser    schedule 28.06.2017
comment
Спасибо за этот подробно объясненный ответ! - person Jota.Toledo; 23.10.2018
comment
Я считаю, что команда «npm install ./local-types/foo» отсутствует в подробной версии. - person Anderson Paiva; 11.02.2020