VSCode неверно выводит тип возврата Sequelize findOne и findAll как любой - PullRequest
0 голосов
/ 09 февраля 2020

У меня есть модель, определенная как:

import { Sequelize, Model, BuildOptions, DataTypes } from 'sequelize';
interface User extends Model {
  readonly id: string;
  email: string;
  name: string;
  password_hash: string;
  readonly created_at: Date;
  readonly updated_at: Date;
}
type UserStatic = typeof Model & {
  new (values?: Partial<User>, options?: BuildOptions): User;
};
export function build(seq: Sequelize) {
  const User = seq.define(
    'User',
    {
      id: {
        type: DataTypes.UUID,
        defaultValue: DataTypes.UUIDV4,
        primaryKey: true,
        allowNull: false,
      },
      email: {
        type: DataTypes.STRING,
        allowNull: false,
        unique: true,
      },
      password_hash: {
        type: DataTypes.STRING,
        allowNull: false,
      },
    },
    {
      timestamps: true,
      createdAt: 'created_at',
      updatedAt: 'updated_at',
    }
  ) as UserStatic;
  return User;
}

Как и , определенная в документе .

Но, когда я использую эту модель, я получаю в результате тип findAll и findOne как:

(method) Model<T = any, T2 = any>.findAll<User>(this: (new () => User) & typeof Model, options?: FindOptions | undefined): any
(method) Model<T = any, T2 = any>.findOne<User>(this: (new () => User) & typeof Model, options?: FindOptions | undefined): any (+1 overload)

Но, перейдя к определению, я вижу:

public static findAll<M extends Model>(this: { new (): M } & typeof Model, options?: FindOptions): Promise<M[]>;
public static findOne<M extends Model>(
  this: { new (): M } & typeof Model,
  options?: FindOptions
): Promise<M | null>;
public static findOne<M extends Model>(this: { new (): M } & typeof Model, options: NonNullFindOptions): Promise<M>;

Итак, как видно, тип M выводится правильно, но тип возврата меняется с Promise<M | null> или Promise<M[]> на any

Кто-нибудь знает, как я могу это исправить и получить правильный тип напрямую?

Информация:

  • VSCode: 1.42.0

  • Машинопись: 3.7.5

  • Секвелизация: 5.21.4

Я справился с обходным путем путем явного приведения типа возвращаемого значения

const user = (await UserModel.findAll({
  where: {
    email: args.input.email,
  },
})) as User | null;

Но это дополнительная работа, которую я не хочу получать каждый раз, когда использую модель сиквелиза

1 Ответ

0 голосов
/ 09 февраля 2020

Нашел, забыл добавить @types/bluebird и @types/validator

...