У меня есть модель, определенная как:
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;
Но это дополнительная работа, которую я не хочу получать каждый раз, когда использую модель сиквелиза