javascript - Hur kan jag skriva och använda egna deklarationsfiler som inte finns på @types eller DefinitelyTyped?


Jag använder ett npm-paket som heter foo som inte finns på DefinitelyTyped. Med andra ord, @types/foo finns inte (eller är eventuellt inaktuell!)

Jag skulle fortfarande vilja kunna använda det under striktare inställningar som noImplicitAny, så jag behöver skriva de anpassade definitionsfilerna själv. Så småningom skulle jag vilja skicka en pull-begäran till DefinitelyTyped så att denna fil kan vara användbar för andra utanför mitt projekt.

Det finns enkla lösningar som att skapa en global fil med namnet ./src/types.d.ts där jag kan skriva följande

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

Men om jag använder det syntaxet kan jag eventuellt behöva skriva om min modul när jag skickar den till DefinitelyTyped.

Hur kan jag strukturera mitt projekt så att jag enkelt kan skapa och sedan skicka lokala .d.ts-filer till DefinitelyTyped?

Svar #1

Jag kommer att göra detta steg för steg med förklaringar, så det kan verka långt, men att följa de givna instruktionerna bör bara ta några minuter. Faktum är att här är den korta versionen som du kan köra direkt i antingen bash eller 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

Bakgrund

Låt oss föreställa oss följande projektstruktur:

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

Skapa en mapp för lokala typer i roten av ditt projekt.

Det spelar ingen roll vad det kallas, men vi kommer att kalla det local-types. Du kan ändra det till vad du vill när du har en bra förståelse för vad vi har gjort här.

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

I de flesta fall utanför detta exempel, skulle jag kanske bara kalla detta types.

Skapa ett nytt paket i din lokala typer-katalog

Eftersom du försöker importera ett modul som heter foo, kommer vi att skapa en mapp som heter foo med en index.d.ts.

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

export function hello(): void;

export function world(): void;

Vi vill också göra detta till ett npm-paket genom att skapa en package.json:

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

Vid det här laget bör ditt projekt se ut så här:

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

Du bör nu kunna bara importera foo från vilken fil som helst inom src.

import { hello, world } from "foo";

hello();
world();

Tänk på att du kanske inte har ett paket med en enda ingångspunkt med en index.d.ts. I så fall vill du efterlikna paketstrukturen som den har publicerats på npm.

Lägg till paketet som ett beroende (eller eventuellt som ett dev-beroende)

Om du skriver ett bibliotek vill du troligtvis ha detta i dina beroenden, men appar kanske vill använda devDependencies. Lägg helt enkelt till file:./local-types/foo som version för @types/foo:

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

Publicera till DefinitelyTyped

Är dina .d.ts-filer kompletta och användbara? Överväg att skriva några tester och skicka en pull-begäran till DefinitelyTyped så att andra kan dra nytta av det arbete du har gjort!

Om du kan importera dessa paket utan problem vid körning, kommer du redan att ha den lämpliga paketstrukturen.

Saker att ha i åtanke

  • Använd inte declare module "..."-syntaxen inom någon av dessa lokala typ-paket.

    • ...om du inte försöker skriva en modulförstärkning. Men det gör du antagligen inte.
  • Se till att dina filer har minst en import eller export om de inte är verkliga skript-/globala filer.
  • Följ råden som ges på TypeScript-webbplatsen om att skapa deklarationsfiler.

Relaterade artiklar