Enums i Typescript d.ts-fil
Jag är ny på Typescript och jag använder det i ett create-react-projekt. Jag har en mapp som heter /typings som min tsconfig.json-fil pekar på och hittills har jag lagt alla mina typdeklarationer i en index.d.ts-fil i den mappen.
Hittills så bra. "type" och "interface" deklarationer verkar vara tillgängliga i alla delar av mitt projekt. Jag exporterar dem inte uttryckligen från index.d.ts-filen och importerar dem inte i någon annan fil.
Problemet uppstår när jag deklarerar följande...
enum Gender {male, female}
När jag försöker använda enumen i en annan fil får jag felet...
Ambient const enums are not allowed when the '--isolatedModules' flag is provided
Jag har läst andra svar på SO som säger att du bör deklarera enumen som en const men det hjälper inte. Jag har också sett förslaget att du bör "export default undefined" längst ner i filen men när jag gör det är ingen av de andra typerna tillgängliga i resten av projektet.
Slutligen har jag försökt ändra mina kompilatoralternativ till att sätta "isolatedModules": false, men det ändras automatiskt tillbaka till true vid kompilation. Tydligen kommer create-react-app alltid att göra detta.
Vad ska jag göra för att tillåta att enums som deklareras i min index.d.ts-fil blir tillgängliga att använda i resten av mitt projekt automatiskt?
Svar #1
Enums kan inte gå in i en *.d.ts.
Anledningen till detta är att enum har en kompilerad output, medan andra .d.ts såsom gränssnitt inte har det.
Till exempel:
enum Hello{
One = 'This is one',
Two = ''
}
kompileras till:
"use strict";
var Hello;
(function (Hello) {
Hello["One"] = "This is one";
Hello["Two"] = "";
})(Hello || (Hello = {}));
medan ett gränssnitt:
interface Hello {
test: string;
}
kompilerar till:
// an empty file, as interfaces are only used during pre-compile not in Javascript.
.d.ts-filer importeras inte uttryckligen till filer och som ett resultat vet därför inte Typescript var innehållet i denna fil ska infogas. Som du troligen är medveten om, kompilers Javascript uppifrån och ned, så var den enumen infogas i den resulterande Javascript-koden är avgörande.
Historiskt sett lägger vi våra enums i en common.ts-fil och klass som vi importerar när du behöver använda en enum.
