扩展两个接口中的任何一个并添加一些属性的接口?

时间:2018-10-19 13:50:47

标签: typescript

Action应该具有属性childrensize?variant?

Action也应实现ButtonLink中的一个。

我该如何实现?

这是我的最佳尝试

interface Button {
    action: () => void;
    href?: never;
}
interface Link {
    href: string;
    action?: never;
}

interface Action extends Button | Link {
    children: string;
    size?: 'large' | 'small';
    variant?: 'secondary';
}

错误:

[tslint] Forbidden bitwise operation

我真正具有的功能要求是我要创建一个类型或接口,该类型或接口具有一些道具加上actionhref,但不能同时包含action和{{1} }。

1 个答案:

答案 0 :(得分:1)

不幸的是,接口无法扩展联合类型。您可以改用交叉点类型:

interface Button {
    action: () => void;
    href?: never;
}
interface Link {
    href: string;
    action?: never;
}

type Action =  (Button | Link) & {
    children: string;
    size?: 'large' | 'small';
    variant?: 'secondary';
}

let a: Action = {
    href: "",
    children: "",
    size: "large"
}


let a2: Action = {
    action: () => { },
    children: "",
    size: "large"
}


let a3: Action = { // error
    href: ""
    action: () => { },
    children: "",
    size: "large"
}