为何可在接口声明前将其用作泛型参数?
为什么这段TypeScript代码能正常运行?
你可能会疑惑:下面这段代码里SomeInterface明明还没完成定义,怎么就能作为参数传给InferAttributes和InferCreationAttributes呢?
interface SomeInterface extends Model< InferAttributes<SomeInterface>, InferCreationAttributes<SomeInterface> > { // 接口属性定义 }
原因其实和TypeScript的类型系统特性以及Sequelize工具类型的设计有关:
TypeScript支持接口的自引用与循环类型解析:TypeScript在处理接口声明时,不会立即对所有泛型参数求值,而是采用延迟解析策略。当你在
extends里引用SomeInterface时,TypeScript能识别这是当前正在定义的接口,会等整个接口定义完成后再解析泛型参数的具体类型,不会因为“提前引用”报错。Sequelize工具类型专为这种场景设计:
InferAttributes和InferCreationAttributes是Sequelize提供的工具类型,作用就是从模型接口中提取对应属性类型。这种自引用写法正是Sequelize官方推荐的模型接口定义方式,工具类型内部已经做了适配,能正确解析这种循环引用的类型。
简单来说,TypeScript的类型系统允许这种“先引用后定义”的接口自引用,再加上Sequelize工具类型的适配,这段代码就能正常运行了。
内容的提问来源于stack exchange,提问作者Marc Sloth Eastman
相关产品推荐
相关产品推荐

