如何在打字稿中键入函数引用

问题描述 投票:0回答:1

给出以下函数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'。

typescript memoization typescript-generics
1个回答
0
投票

我想问题是编译器无法保证在调用函数时类型是可以协调的,请考虑以下示例:

getCards<User>("name");

这里T明确地设置为User但卡名单将默认为Card & { id: number },因此它们将不匹配。


我认为这可以通过在类型参数上添加如下约束来解决,但不幸的是,这不起作用:

function getCards<T extends Card & { id: number }>

这不太有效,因为该类型用作数组的类型参数。所以,如果你将T设置为例如SpecialCard有一个属性bonus(在Card类型中不存在)并且你从默认卡片列表中检索一个项目,你将不会得到SpecialCard类型的对象,因为该属性将丢失。

您的约束必须是子集,而不是卡属性的超集,因此通用可能根本不适合。

© www.soinside.com 2019 - 2024. All rights reserved.