Typescript 在编译时获取泛型的名称 问题:

Typescript 在编译时获取泛型的名称 问题:,typescript,generics,sequelize.js,Typescript,Generics,Sequelize.js,有没有办法做到这一点: type-Example={[nameof T]:T} ^^^^^^ 例如: // Structure: // User -- UserRole -- Role // User object: const user = User.find(...) user.role[0].UserRole // <-- This object is based on the name of the Table 类MyClass{} //所以它看起来像(在编译时): 示例={

有没有办法做到这一点:

type-Example={[nameof T]:T}
^^^^^^
例如:

// Structure:
// User -- UserRole -- Role

// User object:
const user = User.find(...)
user.role[0].UserRole // <-- This object is based on the name of the Table
类MyClass{}
//所以它看起来像(在编译时):
示例={'MyClass':MyClass}
动机 我之所以要这样做,是因为我正在使用Sequelize,Sequelize在处理多对多关系时会自动创建对交叉表的引用。例如:

// Structure:
// User -- UserRole -- Role

// User object:
const user = User.find(...)
user.role[0].UserRole // <-- This object is based on the name of the Table
//结构:
//用户--用户角色--角色
//用户对象:
const user=user.find(…)

user.role[0].UserRole//TL;医生:不,没有好办法


在您的示例中,名为
MyClass
的类型是提供给
MyClass
实例的接口。由于您的示例代码没有定义属性或方法,因此它是空对象类型
{}
MyClass
没有“name”属性。因此,无法编写
示例
并让编译器从中生成
{MyClass:MyClass}


您可能希望编译器可以查看名称
MyClass
,并将其转换为
“MyClass”
,但TS类型系统不是这样工作的。TypeScript的类型系统是,而不是。如果TypeScript中的两种类型具有相同的结构(相同类型的属性和方法),则它们是相同的类型。另一方面,仅仅因为TypeScript中的两种类型被不同的名称引用或具有不同的声明,并不意味着它们是不同的类型:

不幸的是,这也不能真正做到这一点。编译器仅将
MyClass
构造函数的
name
属性视为
string
类型:

const myClassName = MyClass.name; // string
所以
示例
就是
{[k:string]:MyClass}
;还不够好

有一个公开的问题,要求编译器为具有已知名称的函数(如类构造函数)提供字符串literal
name
属性,但这似乎不会发生(特别是因为如果缩小代码,则
name
属性可能不是您所期望的)

您可以尝试为
MyClass
提供
静态名称
属性,但编译器也不喜欢这样,您需要使用
/@ts ignore
抑制警告:

class MyClass {
    //@ts-ignore 
    declare static readonly name: "MyClass";
}
示例
{MyClass:MyClass}
的情况下,这个“工作”很有效,但它很难看,不可伸缩


不幸的是,我会说“不,这里没有什么好东西”

我担心会是这样:(。我可能需要研究反射库和其他形式的预处理。
const myClassName = MyClass.name; // string
class MyClass {
    //@ts-ignore 
    declare static readonly name: "MyClass";
}