是否可以在打字稿中获取泛型类型参数的名称。
有这种方法。
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);
缺点是不能只对派生自数据值类型的泛型执行此操作。