如何使用typescript的接口扩展?

时间:2017-12-07 07:26:38

标签: typescript

以下是我的原始代码

interface customerInfo {
    Success: boolean;
    Code: string;
    Message: string;
    Result: {
        name: string
        tel: number
    }
}

interface accountInfo {
    Success: boolean;
    Code: string;
    Message: string;
    Result: {
        xxx: number
        vvv: string
    }
}

如何为此代码使用extends?

interface outer {
    Success: boolean;
    Code: string;
    Message: string;
    Result: Object;
}

interface customerInfo extends outer.Result {
        name: string
        tel: number
}

interface accountInfo extends outer.Result {
        xxx: number
        vvv: string
}

上面的代码是否正确? 接口customerInfo和accountInfo的内容在结果Object下。

2 个答案:

答案 0 :(得分:0)

您可以使outer通用,类型参数将是结果类型:

interface outer<T> {
    Success: boolean;
    Code: string;
    Message: string;
    Result: T;
}

interface customerInfo extends outer<{
    name: string
    tel: number
}> {
    //Other members 
}

interface accountInfo extends outer<{
    xxx: number
    vvv: string
}>{
    //Other members 
}

在上面的类型中,type参数是内联接口声明,但是如果要重用它,最好使用命名接口。例如:

interface customerInfoResult {
    name: string
    tel: number
}
interface customerInfo extends outer<customerInfoResult> {
    //Other members 
}

答案 1 :(得分:0)

最简单的事情就是使用新的outer类型扩展Result

interface customerInfo extends outer {
  Result: {
        name: string
        tel: number
      }
}

如果您尝试将另一个对象分配到Result中的customerInfo,则会抱怨。

但是,你真的想这样做吗?您的所有回复都是CodeMessageResult,无论这些回复是成功还是失败?

更容易定义customerInfoaccountInfo,然后将它们包含在outer界面中,该界面本身经过修改以区分成功和失败案例:

interface customerInfo {
    name: string
    tel: number
}

interface outerSuccess {
    Success: true;
    Result: customerInfo | accountInfo;
}
interface outerFail {
    Success: false;
    Code: string;
    Message: string;
}
type outer = outerSuccess | outerFail;

现在使用它时:

if (response.Success) { ... can access Result here ... }
else { ... can access Code and Message here ... }

P.S。 tel: number?也应该是一个字符串。