Att få namnet på en generisk typparameter i Typescript
Är det möjligt att få namnet på en generisk typparameter i TypeScript.
att ha denna metod.
getName<T>(): string {
.... use some operator or something
}
använder det så här
class MyClass{
}
getName<MyClass>(); ///=> should return 'MyClass'
Jag har försökt använda https://www.npmjs.com/package/ts-nameof men det fungerar inte.
Gör
const name = nameof<T>();
misslyckas
Eller kanske finns det ett annat sätt att uppnå detta?
Svar #1
Du behöver säkerställa att du har korrekt installerat förutsättningarna för att använda TypeScript-transformeringsplugins.
TypeScript-transformeringsplugins som ts-nameof kräver viss inställning eftersom de är beroende av transform-kompilatorn, ttypescript.
Vad du behöver göra:
1. Installera ttypescript och ts-nameof:
npm i ttypescript ts-nameof @types/ts-nameof -D2. Lägg till ts-nameof i din plugins-array i tsconfig.json:
{
"compilerOptions": {
"noEmitOnError": true,
"target": "ES2020",
"plugins": [{ "transform": "ts-nameof", "type": "raw" }],
}
}
3. Ändra sökvägen till din tsdk till platsen för ttypescript i dina VSCode-användarinställningar:
"typescript.tsdk": "node_modules/ttypescript/lib" // this is for intellisense
4. Kör med npx
npx ttsc
Sedan :
const name = nameof<MyClass>();
kommer att generera:
const name = "MyClass";
Exempel: ts-nameof-exempel
Originaldokumentation:
- ttypescript-installation
- ts-nameof-inställning för tsc
Svar #2
Du kan inte, inte med bara TypeScript. TypeScript kompilerar endast TypeScript till JavaScript. JavaScript har inget som liknar generiska typer, så:
getName<MyClass>();
kompileras till
getName();
Självklart förväntar du dig inte att få olika resultat av samma getName() utan parameter. Du behöver något för att generera mer kod för att göra det, eller lägga till en parameter till din funktion:
function getName<T extends new (...args: any[]) => any>(clazz: T): string {
return clazz.name;
}
class MyClass{
}
getName(MyClass);
Det fungerar bara med Class, som finns vid körning.
