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

TypeScript函数根据参数类型返回对应类型的实现问题

解决方案

要解决这个类型错误,核心是让函数保留输入数组的具体类型信息,避免将其宽泛地推断为联合类型数组。以下是两种可行的实现方式:

方式一:基于公共属性的泛型约束

利用A和B的公共属性requiredField作为泛型约束,确保函数可以处理任何包含该属性的类型数组,同时返回与输入完全匹配的类型:

interface A {
  requiredField: string;
  optionalField: string;
}

interface B {
  requiredField: string;
}

export const addOptionalData = <T extends { requiredField: string }>(
  list: T[]
): T[] => {
  return list.map(listItem => {
    listItem.requiredField = 'new value';
    return listItem;
  });
};

// 测试用例
const listA: A[] = [{
  requiredField: 'original value',
  optionalField: 'original value'
}];

const listB: B[] = [{
  requiredField: 'original value'
}];

// 类型完全匹配,无错误
let enrichedListA: A[] = addOptionalData(listA);
let enrichedListB: B[] = addOptionalData(listB);

方式二:明确约束为A或B的子类型

如果希望严格限制函数只能处理A或B类型的数组,可以直接将泛型约束为A | B:

interface A {
  requiredField: string;
  optionalField: string;
}

interface B {
  requiredField: string;
}

export const addOptionalData = <T extends A | B>(
  list: T[]
): T[] => {
  return list.map(listItem => {
    listItem.requiredField = 'new value';
    return listItem;
  });
};

// 测试用例
const listA: A[] = [{
  requiredField: 'original value',
  optionalField: 'original value'
}];

const listB: B[] = [{
  requiredField: 'original value'
}];

// 类型完全匹配,无错误
let enrichedListA: A[] = addOptionalData(listA);
let enrichedListB: B[] = addOptionalData(listB);

错误原因解析

  1. 初始实现问题:直接使用A[] | B[]作为参数类型时,TypeScript会将map的返回值推断为(A | B)[],无法直接赋值给A[]或B[]——因为联合类型数组中的元素可能是另一种类型。
  2. 泛型尝试问题:之前的泛型错误地将T约束为A | B(单个对象类型),而函数实际接收的是数组,导致list.map报错;同时条件类型的使用也多余,因为泛型本身可以保留具体类型信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 01:51:02