如何使用泛型的类名作为结果类型的字符串值

时间:2019-05-16 04:32:19

标签: typescript generics

我正在尝试为对象的某些序列化表示形式创建一个类型,该类型包括类名作为字符串值。

基本上,我正在尝试这样的事情:

interface Serialised<T> {
    className: nameof T; // error
    value: T;
}

现在,TypeScript中当然没有nameof。所以,目前我正在使用基本的类型描述,然后再使用一些类型转换:

interface Serialised {
    className: string;
    value: object;
}

所以这里有一个问题,或者更确切地说是其中的3个:

  1. 是否存在可以应用于任何类的通用解决方案?
  2. 是否存在可以应用于某些基类的任何后代的通用解决方案?
  3. 是否有可以应用于预定义的类集的解决方案?也许通过枚举?

1 个答案:

答案 0 :(得分:0)

无法提取打字稿中的类名称。

我们能做的最好的事情就是要求任何可序列化的类都具有一个名为className(或其他名称)的静态字段,我们可以使用类型查询来提取该静态字段:

interface SerializableClass {
    new (...a:any[]): any;
    readonly className: string;
}
interface Serialised<T extends SerializableClass> {
    className: T['className']; // error
    value: InstanceType<T>;
}

class Ok { 
    static readonly className = "Ok"
}

let o: Serialised<typeof Ok> = {
    className: "Ok",
    value: new Ok()
}

let o2: Serialised<typeof Ok> = {
    className: "Okk", //err
    value: new Ok()
}

class Bad{}
let o3: Serialised<typeof Bad> //err Type 'typeof Bad' does not satisfy the constraint 'SerializableClass'.