组合扩展不同类/接口/类型打字稿的接口

时间:2021-02-24 10:40:30

标签: typescript interface

我有各种接口可以扩展不同的 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 与任何其他接口一样,每个接口都有一些示例属性。

0 个答案:

没有答案