我有各种接口可以扩展不同的 mongodb/mongoose 错误。我是打字稿的新手,这可能很明显,如果是这样的话,很抱歉。如果你们有解决方案,请解释它/提供指向文档的链接。
好吧,让我们来看看代码......我的接口 -
interface IError extends Error {
statusCode: number;
status: string;
isOperational: boolean;
code?: string;
keyName?: keyName;
keyPattern?: keyPattern;
}
interface ICastError extends CastError {
code?: string;
statusCode: number;
status: string;
isOperational: boolean;
keyName?: keyName;
keyPattern?: keyPattern;
}
interface IMongoError extends MongoError {
statusCode: number;
status: string;
isOperational: boolean;
keyPattern?: object;
errors: {
[key: string]: {
message: string;
name: string;
};
};
code?: string;
keyName?: keyName;
}
正如你所看到的,除了我不得不在所有接口中放置属性,因为我使用它们的代码是这样的 -
let error: IError | ICastError | IMongoError = Object.assign(err);
if (error.name == 'CastError') error = handleCastErrorDB(error as ICastError);
if (error.name == 'ValidationError') error = handleValidationErrorDB((error as unknown) as IMongoError);
if (error.code == '11000') error = handleDuplicateFieldsDB((error as unknown) as IMongoError);
if (error.isOperational) {
res.status(error.statusCode).json({
status: error.status,
message: error.message,
});
} else {
// Some irrelevant functionality
}
我使用过这样的接口 - IError | ICastError | IMongoError
。因此,当我没有在所有 3 个接口中使用的每一个属性都说“{someproperty} 未在接口 {someinterface} 中定义”时,打字稿吓坏了。有很多代码重复,我很想用一种方法来重构它。如果我问的是不可能的,我也可以重构我实现接口的方式(IError | ICastError | IMongoError
部分)。
提前致谢!这可能看起来很简单/显而易见,但请帮帮我。
PS:我没有在标签中包含 mongoDB,因为我认为它与手头的问题没有真正的关系。如果您不了解 mongoDB,那么只需假设这些接口 IError | ICastError | IMongoError
与任何其他接口一样,每个接口都有一些示例属性。