You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用对象接口实现Function overloading时遇类型不兼容错误求助

解决TypeScript联合类型中props.a与props.b类型不匹配的报错

报错原因

你写的代码里,函数实现部分的参数是props1 | props2联合类型,TypeScript没办法确定props.a的类型和props.b的参数类型是完全匹配的——比如理论上存在props.a是string但props.b是接受number的函数这种矛盾情况(虽然重载声明限制了输入,但联合类型的类型检查是独立的)。所以props.b的参数类型会被推断为string & number,也就是never,自然没法接受string | number类型的props.a,就出现了报错。

解决方案

方法一:用类型守卫区分两种情况

在函数实现里通过typeof判断props.a的类型,让TypeScript明确当前分支对应的是哪个接口:

interface props1{
    a: string,
    b: (i: string)=>void
}
interface props2{
    a: number,
    b: (i: number)=>void
}
function testFunction(props: props1): void;
function testFunction(props: props2): void;
function testFunction(props: props1 | props2){
    if (typeof props.a === 'string') {
        // 这里TypeScript能确定当前是props1类型
        props.b(props.a);
    } else {
        // 这里确定是props2类型
        props.b(props.a);
    }
}

方法二:用泛型关联a和b的类型

如果可以调整接口结构,用泛型定义一个通用的Props接口,让a的类型和b的参数类型绑定在一起,这样TypeScript能直接推断出两者的匹配关系:

interface Props<T> {
    a: T,
    b: (i: T) => void
}

function testFunction<T extends string | number>(props: Props<T>): void {
    props.b(props.a);
}

这样两种写法都能让props.a正常传入props.b执行,不会再出现类型报错。

内容的提问来源于stack exchange,提问作者Lucien950

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 11:05:11