Búsqueda de sitios web

Obteniendo el nombre de un parámetro de tipo genérico en Typescript


¿Es posible obtener el nombre de un parámetro de tipo genérico en TypeScript?

teniendo este método.

getName<T>(): string {
   .... use some operator or something 
}

usándolo así

class MyClass{
}


getName<MyClass>(); ///=> should return 'MyClass'

He intentado usar https://www.npmjs.com/package/ts-nameof pero no funciona.

Haciendo

const name = nameof<T>();

falla

¿O tal vez hay otra manera de lograr esto?

Respuesta #1

Necesitas asegurarte de que has configurado correctamente los requisitos previos para usar los complementos de transformación de TypeScript.

Los complementos de transformación de TypeScript como ts-nameof requieren cierta configuración porque dependen del compilador de transformación, ttypescript.

Lo que necesitas hacer:

1. Instala ttypescript y ts-nameof:

npm i ttypescript ts-nameof @types/ts-nameof -D

2. Agrega ts-nameof a tu matriz de plugins en tsconfig.json:

{
  "compilerOptions": {
    "noEmitOnError": true,
    "target": "ES2020",
    "plugins": [{ "transform": "ts-nameof", "type": "raw" }],
  }
}

3. Cambia la ruta de tu tsdk a la ubicación de ttypescript en la configuración de usuarios de tu vscode:

"typescript.tsdk": "node_modules/ttypescript/lib" // this is for intellisense

4. Ejecutar con npx

npx ttsc

Entonces :

 const name = nameof<MyClass>();

generará:

const name = "MyClass";

Ejemplo: ts-nameof-ejemplo

Documentación original:

  • configuración de TypeScript
  • configuración de ts-nameof para tsc

Respuesta #2

No puedes, no solo con TypeScript. TypeScript solo compila TypeScript a JavaScript. JavaScript no tiene algo como un tipo genérico, así que:

getName<MyClass>();

se compila a

getName();

Por supuesto, no esperas obtener resultados diferentes del mismo getName() sin parámetro. Necesitas algo para generar más código para poder hacerlo, o añadir un parámetro a tu función:

function getName<T extends new (...args: any[]) => any>(clazz: T): string {
  return clazz.name;
}

class MyClass{
}

getName(MyClass);

Solo funcionará con Class, que existe en tiempo de ejecución.

Artículos relacionados