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

如何编写继承接口的TypeScript可选泛型?语法求解

解决可选泛型的继承约束语法问题

你的代码里泛型D的语法完全错误,D = void extends IUpdateItems不符合TypeScript的泛型定义规则。要实现可选泛型D继承自IUpdateItems的需求,需要遵循<泛型名 extends 约束 = 默认值>的语法格式,同时还要保证itemToDelete._id的访问有类型安全保障。

正确写法示例

interface IUpdateItems {
  _id: string;
}

// 泛型D约束为IUpdateItems的子类,默认类型设为T(和第一个泛型保持一致)
export const deleteItem = <T extends IUpdateItems, D extends IUpdateItems = T>(
  items: T[],
  itemToDelete: T | D
): T[] => {
  return items.filter((item) => item._id !== itemToDelete._id);
};

语法说明

  • D extends IUpdateItems:强制泛型D必须继承IUpdateItems,这样itemToDelete无论传入T还是D类型,都肯定有_id属性,避免类型报错。
  • = T:给D设置默认类型为T,这样调用函数时如果不显式指定D,itemToDelete就默认只能传入T类型,和常规用法一致。

可选调整:如果希望D默认是基础接口类型

如果你希望默认情况下,itemToDelete可以传入任意符合IUpdateItems的对象(不一定和T完全一致),可以把D的默认类型设为IUpdateItems:

export const deleteItem = <T extends IUpdateItems, D extends IUpdateItems = IUpdateItems>(
  items: T[],
  itemToDelete: T | D
): T[] => {
  return items.filter((item) => item._id !== itemToDelete._id);
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 09:36:22