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 -D

2. 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.

Relaterade artiklar