打字稿泛型类型 T toString

Nor*_*ino 8 types typescript

我认为不可能,但值得一问。在泛型方法或类中,我想记录已使用的泛型 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 添加到参数中。

And*_*eas 5

嗯,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 类型名称。这就是为什么这有效。


Jav*_*zán 5

在搜索了整个互联网、制作了自己的装饰器并大量摆弄 Typescript 之后,我被这篇文章绊倒了:

在运行时获取对象的类名

基本上Message.name只要Message是一个类就可以使用。

但要小心,因为如果在进行生产构建时类名被缩小,这可能会停止工作,因此在使用此方法之前请进行检查。