【发布时间】:2019-02-12 04:32:57
【问题描述】:
考虑以下简化函数,该函数接受一个对象和该对象的属性,并返回该对象的克隆,仅具有指定的属性:
export function clonePick<T, K extends keyof T>(obj: T, prop: K) {
const keys = Object.keys(obj).filter(k => k === prop)
return keys.reduce(
(clone: any, key: string) => {
return { ...clone, [key]: obj[key as keyof T] };
},
{}
);
}
这本质上与 Pick 的行为相同,除了一个值而不是一个类型,因此它的返回类型 可以表示为:
Pick<T, prop>
除了以上是无效的打字稿。但是,我们可以在调用函数时在运行前知道prop well 的值:
interface ITest {
numProp: number;
strProp: string;
}
const test = { numProp: 1, strProp: '1' }; // <-- type is ITest
const testClone = clonePick(test, 'numProp') // <-- type is any
我可以很容易地明确声明:
const testClone: Pick<ITest, 'numProp'> = clonePick(test, 'numProp')
但是,如果我可以将该行为作为上述函数的一部分包含在内,它会更易于维护。这可能吗?最好它可以与一组属性以及单个道具一起使用
【问题讨论】:
标签: typescript