【问题标题】:Sequelize / Typescript: Types of parameters 'values' and 'values' are incompatibleSequelize / Typescript:参数“值”和“值”的类型不兼容
【发布时间】:2020-11-22 05:06:00
【问题描述】:

我正在尝试创建一个BaseModel,我的所有模型都从该BaseModel 继承。 我也在尝试创建一个单独的 method() 函数,它可以获取我的任何模型作为参数。

这是我的示例代码:

import {
    Model, Optional
} from 'sequelize'; // v6.3.5


interface DefaultAttributes {
    id: number;
}
interface TestAttributes extends DefaultAttributes {
    field: number;
}

class BaseModel<T extends DefaultAttributes> extends Model<T, Optional<T, 'id'>> {
    static test() {
    }
}

class MyModel extends BaseModel<TestAttributes> {
}

function method<T extends typeof BaseModel>(model: T) {
    model.test();
}

method(MyModel) // <<<<<< TypeScript ERROR

我已尝试按照文档中描述的方式进行所有操作。 https://sequelize.org/master/manual/typescript.html

我收到以下 TypeScript 错误:

TS2345:“typeof MyModel”类型的参数不可分配给“typeof BaseModel”类型的参数。参数“values”和“values”的类型不兼容。类型 'Optional' 不可分配给类型 'Optional'。 'Optional' 类型中缺少属性 'field',但在 'Pick' 类型中是必需的。

请有人帮助我我做错了什么,或者我如何创建一个可以接收从BaseModel继承的任何UniqueModel的方法?

【问题讨论】:

  • 如果将function method&lt;T extends typeof BaseModel&gt; 更改为function method&lt;T extends BaseModel&gt; 会发生什么?
  • @niceman 在这种情况下,该函数不会接受Class 作为参数,但它需要instance

标签: javascript typescript sequelize.js


【解决方案1】:

试试这个:

import {
    Model, Optional
} from 'sequelize'; // v6.3.5

interface DefaultAttributes {
    id: number;
}
interface TestAttributes extends DefaultAttributes {
    field: number;
}

class BaseModel<T extends DefaultAttributes> extends Model<T, Optional<T, 'id'>> {
    static test() {
    }
}

class MyModel extends BaseModel<TestAttributes> {
}

function method<T extends BaseModel>(model: T) {
    model.test();
}

method(MyModel)

【讨论】:

  • 它在T extends BaseModel 上显示错误Generic type 'BaseModel ' requires 1 type argument(s).。但是它不是一个好的解决方案,因为MyModelmethod(MyModel))不是实例,而是类。
  • 最后一个建议是确保您的模块实际上能够被加载,@Adam
猜你喜欢
  • 1970-01-01
  • 2020-12-11
  • 2019-05-20
  • 1970-01-01
  • 1970-01-01
  • 2019-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多