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

TypeScript数组解构调用泛型函数报错:参数类型不匹配求解

问题:TypeScript数组解构后函数调用触发类型错误

我写了下面的代码,期望调用bike({name:"bike"})时正常运行,但触发了类型错误:

const crateBox = <BikeData, CarData>()=>{

    const bike = (data:BikeData)=>{
        console.log("bike data: ", data);
    }

    const car = (data:CarData)=> {
        console.log("car data: ", data);
    }

    return [bike, car];
}

const [bike, car] = crateBox<{name:string}, {type:string}>();

bike({name:"bike"})

如果改成对象解构的写法就能正常运行,但我希望保留数组解构的用法,该怎么解决?

对象解构的可行代码:

const crateBox = <BikeData, CarData>()=>{

    const bike = (data:BikeData)=>{
        console.log("bike data: ", data);
    }

    const car = (data:CarData)=> {
        console.log("car data: ", data);
    }

    return {bike, car};
}

const {bike, car} = crateBox<{name:string}, {type:string}>();

bike({name:"bike"})

错误原因

TypeScript默认会把返回的数组推断为联合类型数组,也就是((data: {name: string}) => void) | ((data: {type: string}) => void)[]。这意味着解构出来的bike和car都是这两个函数类型的联合类型,调用时TypeScript要求参数必须满足联合类型中所有分支的类型要求,而{name:"bike"}显然不匹配{type:string},因此触发类型错误。

而对象解构时,TS会明确识别每个属性的具体类型,不会合并成联合类型,所以不会报错。


解决方案

方案1:显式指定函数返回类型为元组

直接告诉TypeScript函数返回的是固定顺序的元组,每个位置的类型明确:

const crateBox = <BikeData, CarData>(): [
  (data: BikeData) => void,
  (data: CarData) => void
] => {
    const bike = (data: BikeData) => {
        console.log("bike data: ", data);
    };

    const car = (data: CarData) => {
        console.log("car data: ", data);
    };

    return [bike, car];
};

const [bike, car] = crateBox<{ name: string }, { type: string }>();

bike({ name: "bike" }); // 正常运行

方案2:使用as const断言

在返回数组时添加as const,让TypeScript将数组推断为只读元组,保留每个元素的具体类型,避免合并成联合类型:

const crateBox = <BikeData, CarData>() => {
    const bike = (data: BikeData) => {
        console.log("bike data: ", data);
    };

    const car = (data: CarData) => {
        console.log("car data: ", data);
    };

    return [bike, car] as const;
};

const [bike, car] = crateBox<{ name: string }, { type: string }>();

bike({ name: "bike" }); // 正常运行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 07:08:11