我认为不可能,但值得一问。在泛型方法或类中,我想记录已使用的泛型 T 类型的名称,我需要将其作为字符串。
想象一个这样的方法:
static getTypeName<T>(): string {
return typeof T; // This is wrong
}
Run Code Online (Sandbox Code Playgroud)
我希望能够以这种方式使用它:
let m = getTypeName<Message>(); // Expected string "Message"
let p = getTypeName<Person>(); // Expected string "Person"
Run Code Online (Sandbox Code Playgroud)
上面的getTypeName是错误的,它甚至不会构建。typeof 将在 JS 中转译并且不会产生预期的效果。我尝试了各种事情,但没有成功。
有没有办法实际做到这一点?
编辑:为什么这不是重复的:这个问题
问题和示例代码显示了如何取回对象而不是指定类型的名称。此外,该方法不是通用的,因为如果您尝试传入具有构造函数参数的类型,它将显示错误:“ [ts] 类型为 'typeof MyType' 的参数不可分配给类型为 'new () => MyType 的参数'. " 此外,如果您在泛型方法中使用该函数,则不能使用 T 作为参数,这意味着我需要从泛型 Type 获取名称的任何地方,我都需要将 ctor 添加到参数中。
嗯,TypeScript 中的泛型只是一种有助于类型检查的构造。“T”实际上是“无”——它没有任何东西可以被转译成 JavaScript。但是你需要这个构造函数来获取你的类型名称。这就是您收到该错误消息的原因。您只提供了一个类型,但需要一个值(具有构造函数)才能使您的代码正常工作。
编辑:
无论如何,您需要做的是提供一些 JavaScript 对象。像这样的事情会起作用:
class Foo<T> {
test: T;
constructor(value: T) {
this.test = value;
}
getTypeNameOfTest(): string {
return this.test.constructor.name;
}
}
const foo = new Foo<Date>(new Date());
foo.getTypeNameOfTest(); // => "Date"
const baa = new Foo<string>("Howdy");
baa.getTypeNameOfTest(); // => "string"
Run Code Online (Sandbox Code Playgroud)
但在这里,您提供了一个真正的 JavaScript 对象,而不仅仅是 TypeScript 类型名称。这就是为什么这有效。
在搜索了整个互联网、制作了自己的装饰器并大量摆弄 Typescript 之后,我被这篇文章绊倒了:
基本上Message.name只要Message是一个类就可以使用。
但要小心,因为如果在进行生产构建时类名被缩小,这可能会停止工作,因此在使用此方法之前请进行检查。
| 归档时间: |
|
| 查看次数: |
9665 次 |
| 最近记录: |