typescript 我怎样才能得到扩展Model类的sequelize类的建议(自动完成)?

j8yoct9x  于 2023-02-10  发布在  TypeScript
关注(0)|答案(1)|浏览(154)

我有一个postclass定义为

@Table
class Post extends Model {
    @Column
    declare imgUrl: string

    @Column
    declare userId: string

    @Column
    declare username: string
    
    @Column
    declare profileImgUrl: string
}

但是,当我真正输入字段时,我总是发现自己不得不回头查看模型的源代码,并且由于忘记字段而导致许多错误

const post = new Post({
    imgUrl: 'http://localhost/image.png',
    profileImgUrl: 'http://localhost/image.png',
    username: 'johnsmith',
  })

在本例中,我没有指定所有字段,但也没有从vscode得到错误
所以我的问题是,当我将鼠标悬停在类上时,要让它显示所有字段,当我忘记字段时,要让它给予错误,这样我就不必总是回头查看源代码,该怎么做呢

vc9ivgsu

vc9ivgsu1#

您只需要将class Post extends Model更改为class Post extends Model<Post>
请参见源代码中Model类的声明,地址为https://github.com/sequelize/sequelize/blob/main/packages/core/src/model.d.ts

export abstract class Model<TModelAttributes extends {} = any, TCreationAttributes extends {} = TModelAttributes>
  extends ModelTypeScript {
  //...
  /**
   * Builds a new model instance.
   *
   * @param values an object of key value pairs
   * @param options instance construction options
   */
  constructor(values?: MakeNullishOptional<TCreationAttributes>, options?: BuildOptions);
  // ...
}

也就是说,将Post类本身作为泛型参数传递给TModelAttributes泛型参数。
我可以使用sequelize.js库的以下提取部分重现此过程:

type PartialBy<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;

type NullishPropertiesOf<T> = {
   [P in keyof T]-?: undefined extends T[P] ? P
     : null extends T[P] ? P
       : never
 }[keyof T];

type MakeNullishOptional<T extends object> = PartialBy<T, NullishPropertiesOf<T>>;

class Model<TModelAttributes extends {} = any, TCreationAttributes extends {} = TModelAttributes> {
   constructor(values?: MakeNullishOptional<TCreationAttributes>) {}
}

class Post extends Model<Post> {
   declare imgUrl: string;
   declare userId: string;
}

new Post({
  // fill in the fields
});

它给你你想要的行为:Post构造函数调用参数中的VS代码建议(AKA autocomplete)建议为Post类声明上面声明的字段,如果您没有填充所有字段,它将给予如下错误(当没有填充任何字段时):

Argument of type '{}' is not assignable to parameter of type 'MakeNullishOptional<Post>'.
  Type '{}' is missing the following properties from type 'Omit<Post, never>': imgUrl, userId

对于我为这个repro从库中提取的其他类型,请参见https://github.com/sequelize/sequelize/blob/main/packages/core/src/utils/types.ts
您可能还想阅读有关InferAttributesInferCreationAttributes的信息,您可以像使用extends Model<InferAttributes<Foo>, InferCreationAttributes<Foo>>一样使用它们。
至于你问题的另一部分:
当我将鼠标悬停在类上时,要使它显示所有字段,需要执行什么操作
您可以通过向Post类添加文档注解来完成此操作,例如

/**
 * Documentation comment lorem ipsum ...
 */
@Table
class Post extends Model {
  // ...

相关问题