我有一个函数,它接受一个函数对象:
type ForMembers<S> = {
[Key: string]: (arg: S) => void;
};
export default function transform<S extends { [index: string]: any }, D extends { [index: string]: any }>(
source: S,
interfaceName: string,
forMembers?: ForMembers<S>
): D {
const newObj = extract(source, getKeys(interfaceName));
if (forMembers) {
Object.keys(forMembers).forEach((key) => forMembers[key](newObj));
}
return newObj as unknown as D;
}
这个想法是,我可以传递我想要的任何函数对象,但typescript出于某种原因要求我传递类型上存在的所有属性,否则它会抛出一个错误
例如D是
interface Destination {
name: string;
bio: string;
names: string[];
profession: {
field: string;
level: string;
};
我将函数调用为:
transform<Source, Destination>(sourceData, "Destination", {
name: () => {},
bio: () => {},
profession: () => {},
});
}
会抛出错误:
类型为'{name: () =>无效;生物:()=>无效;职业:()=>无效;}'不能赋值给' formmembers <Destination,>'类型的形参。属性'names'在类型'{name: () =>无效;生物:()=>无效;职业:()=>无效;}',但需要在类型' formmembers <Destination,>'中使用。
如果我添加缺失的属性- '名称',错误消失,但我想只传递我需要的属性,而不是全部。问题是,如何使这个函数包含D的任意属性组合,而不是全部?
您可以使用Partial
:
forMembers?: Partial<ForMembers<S>>