缓存函数应接受最多具有十个不同实体的配置对象.如果实体配置具有字段属性,则它应从对象中选取此字段.
const { users, companies } = useCache({
users: {
ids: ['1', '2'],
},
companies: {
ids: ['3', '4'],
fields: ['title'],
}
});
// typeof users = Record<string, User>;
// typeof companies = Record<string, Pick<Company, 'title'>>;
我试着写这样的东西,但它只适用于第一个重载:
type EntityMap = {
users: User,
companies: Company,
}
type Keys<T> = Array<keyof T>;
type PartialEntity<T extends object, TFields extends Keys<T> | undefined = undefined> = TFields extends undefined
? T
: Pick<T, NonNullable<TFields>[number]>;
type EntityConfig<TName extends keyof EntityMap, TFields extends Keys<EntityMap[TName]> | undefined> = {
[K in TName]: {
ids: string[];
fields?: TFields;
}
};
type EntityResult<TName extends keyof EntityMap, TFields extends Keys<EntityMap[TName]> | undefined> = {
[K in TName]: Record<string, PartialEntity<EntityMap[K], TFields>>;
};
interface CacheFunction {
<TName1 extends keyof EntityMap, TFields1 extends Keys<EntityMap[TName1]>>(
params: EntityConfig<TName1, TFields1>
): EntityResult<TName1, TFields1>;
<
TName1 extends keyof EntityMap,
TFields1 extends Keys<EntityMap[TName1]> | undefined,
TName2 extends keyof EntityMap,
TFields2 extends Keys<EntityMap[TName2]> | undefined
>(
params: EntityConfig<TName1, TFields1> & EntityConfig<TName2, TFields2>
): EntityResult<TName1, TFields1> & EntityResult<TName2, TFields2>;
// same up to 10 names
}
declare const useCache: CacheFunction;