给出以下函数getCards
- 如何为memoize
的输入声明一个类型?它接受一个函数的引用。
import memoize from "fast-memoize";
function getCards<T>(
filterBy: string,
CardsList: T[] = CardsJSON.map((item, i) => ({ ...item, id: i }))
) {
return CardsList;
}
// This is what i've tried.
// const testType: Array<ICard> = getCards<ICard>("test");
const fn = memoize(getCards);
我也为CardsList获得以下类型错误,我无法弄清楚错误是什么..?
TS2322:输入'{id:number; spId?:string |不确定的; callToAction?:string |不确定的; cardTags?:任何[] |不确定的; campaignId:string; cardTitle:string; cardDescription:string; endAgeLimit?:number |不确定的; ......还有37个......; updatedAt:string; } []'不能赋值为'T []'。输入'{id:number; spId?:string |不确定的; callToAction?:string |不确定的; cardTags?:任何[] |不确定的; campaignId:string; cardTitle:string; cardDescription:string; endAgeLimit?:number |不确定的; ......还有37个......; updatedAt:string; ''不能赋值为'T'。
我想问题是编译器无法保证在调用函数时类型是可以协调的,请考虑以下示例:
getCards<User>("name");
这里T
明确地设置为User
但卡名单将默认为Card & { id: number }
,因此它们将不匹配。
我认为这可以通过在类型参数上添加如下约束来解决,但不幸的是,这不起作用:
function getCards<T extends Card & { id: number }>
这不太有效,因为该类型用作数组的类型参数。所以,如果你将T
设置为例如SpecialCard
有一个属性bonus
(在Card
类型中不存在)并且你从默认卡片列表中检索一个项目,你将不会得到SpecialCard
类型的对象,因为该属性将丢失。
您的约束必须是子集,而不是卡属性的超集,因此通用可能根本不适合。