如何编写继承接口的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
相关产品推荐
相关产品推荐

