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