【发布时间】:2019-08-03 21:14:16
【问题描述】:
我想打一个叫做pick的函数,我知道typescript内置了Pick<T, K>,现在我想实现实际的源代码使用部分,但是我卡住了。
这个函数的作用是根据给定的字符串将pick提供object的属性并返回new object。
用法是这样的:
const data = { name: 'Jason', age: 18, isMember: true };
const pickedData = pick(data, ['name', 'isMember']);
console.log(pickedData)
// => { name: 'Jason', isMember: true }
我的pick函数的javascript实现without typescript是这样的:
function pick(obj, properties) {
let result = {}
properties.forEach(property => {
result[property] = obj[property];
});
return result;
}
这里是typescript 版本,但它没有编译:
function pick<T, K extends keyof T>(obj: T, properties: K[]): Pick<T, K> {
let result: Pick<T, K> = {}; // Typescript yells: Type '{}' is not assignable to type 'Pick<T, K>'.
properties.forEach(property => {
result[property] = obj[property];
});
return result;
}
我的 VSCode 截图:
但是,有一个解决办法,不知道是不是good的解决办法,就是加as Pick<T, K>:
function pick<T, K extends keyof T>(obj: T, properties: K[]): Pick<T, K> {
let result: Pick<T, K> = {} as Pick<T, K> ; // Typescript now satisfy with this.
properties.forEach(property => {
result[property] = obj[property];
});
return result;
}
但是,当使用这个pick 函数时,typescript 不会显示拾取的对象属性,而是显示不必要的信息:
它告诉我这个:
// typescript shows me, not what I want.
const pickedData: Pick<{
name: string;
age: number;
isMember: boolean;
}, "name" | "isMember">
typescript 有什么方法可以告诉我这个吗?
// This is what I want typescript to show me.
const pickedData: {
name: string;
isMember: boolean;
}
【问题讨论】:
-
提香的答案就是答案。正确的?提香的回答经常是。但是,如果您在这篇文章中看到了类似的内容(如果略有不同,可能不太复杂),您可能想知道像
Partial<Pick<T, K>>这样简单的事情可能会有所帮助
标签: javascript typescript generics types