[ts] 排他联合类型问题?

// 目前需要这样的结构 

interface IChildLine {
    isLine: boolean
    points: number[]
}

interface IChildCircle {
    isCircle: boolean
    points: number[]
}

interface ITab{
    children:(IChildCircle | IChildLine)[]
}


// 也就是说 ITab 的 children 要么是 isCircle 要么是 isLine ,在一个对象里不能同时存在
我感觉有优化空间,有大佬知道怎么优化吗?
阅读 684
2 个回答
interface IChildBase {
    points: number[];
}

interface IChildLine extends IChildBase {
    type: 'line';
}

interface IChildCircle extends IChildBase {
    type: 'circle';
}

type ChildShape = IChildCircle | IChildLine;

interface ITab {
    children: ChildShape[];
}

// 用类型守卫来检查 children 的类型
function isLine(child: ChildShape): child is IChildLine {
    return child.type === 'line';
}

function isCircle(child: ChildShape): child is IChildCircle {
    return child.type === 'circle';
}

// 示例
const tab: ITab = {
    children: [
        { type: 'circle', points: [1, 2, 3] },
        { type: 'line', points: [4, 5] }
    ]
};

tab.children.forEach(child => {
    if (isLine(child)) {
        console.log('This is a line.', child.points);
    } else if (isCircle(child)) {
        console.log('This is a circle.', child.points);
    }
});

不知道是不是我理解得太简单了

interface ITab {
  children: Array<IChildLine> | Array<IChildCircle>
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Microsoft
子站问答
访问
宣传栏