在 Typescript 中获取泛型类型参数的名称



是否可以在打字稿中获取泛型类型参数的名称。

有这种方法。

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

像这样使用它

class MyClass{
}

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

我试过使用 https://www.npmjs.com/package/ts-nameof 但它不起作用。

行为

const name = nameof<T>();

失败

或者也许有另一种方法可以实现这一目标?

你不能,不能单独使用打字稿。Typescript 只将打字稿编译为 JavaScript。Javascript没有类似泛型的东西,所以:

getName<MyClass>();

编译为

getName();

当然,您不希望在没有参数的情况下对同一getName()产生不同的结果。 你需要一些东西来生成更多的代码才能做到这一点,或者向你的函数添加一个参数:

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

它仅适用于运行时中存在的类。

您需要确保已正确设置使用 TypeScript 转换插件的先决条件。

ts-nameof这样的 TypeScript 转换插件需要一些设置,因为它们依赖于转换编译器,ttypescript.

您需要做什么:

1. 安装 ttypescript 和 ts-nameof:

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

2. 在tsconfig.json中添加 ts-nameof 到你的插件数组中:

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

3. 将tsdk的路径更改为 vscode 用户设置中ttypescript的位置:

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

4. 与npx一起运行

npx ttsc

然后:

const name = nameof<MyClass>();

将生成:

const name = "MyClass";

示例:ts-nameof-example

原始文档:

  • 打字脚本设置
  • TSC 的安装程序名称

一种方法是为函数的参数定义一个类类型接口:

export declare interface ClassType<T> {
new (...args: any[]): T;
}
class MyClass {
}
function getName<TClass>(classType: ClassType<TClass>): string {
return classType.name;
}

这会导致您将类的名称作为参数传递,该参数应提供名称:

let myName = getName(MyClass);

缺点是不能只对派生自数据值类型的泛型执行此操作。

最新更新