gpt4 book ai didi

javascript - Typescript:类型 '{}' 无法分配给类型 'Pick' ,如何正确键入 javascript `pick` 函数?

转载 作者:行者123 更新时间:2023-11-30 11:07:14 28 4
gpt4 key购买 nike

我想输入一个名为 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 截图:

enter image description here

但是,有一个解决方案,我不知道这是不是 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不显示选取的对象属性,而是显示不必要的信息:

enter image description here

它向我展示了这一点:

// 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;
}

最佳答案

第一个问题是{}不应分配给 Pick<T, K>Pick<T, K>可能会具有所需的属性。在某些情况下,类型断言是使事情正常工作的唯一方法,这就是其中之一。 Typescript 不知道您计划稍后分配这些属性,您拥有该信息并以类型断言的形式将其提供给编译器,基本上是说,放松,我知道这实际上并不是 Pick<T, K>但我很快就会做到这一点。

您问题的第二部分并不是功能性的Pick<{ name: string; age: number; isMember: boolean;, "name" | "isMember">结构上相当于{ name: string; isMember: boolean; } 。有时语言服务会扩展这些类型,有时则不会。这是最近的issue描述这个确切的行为。

您可以使用更复杂的类型强制扩展类型(与 {} 相交的恒等映射类型):

type Id<T extends object> = {} & { [P in keyof T]: T[P] }
function pick<T, K extends keyof T>(obj: T, properties: K[]): Id<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;
}

const data = { name: 'Jason', age: 18, isMember: true };
const pickedData = pick(data, ['name', 'isMember']);

console.log(pickedData)

作为警告,没有任何保证 Id永远都会被扩展,我只能说在当前版本Id似乎总是强制扩展映射类型。

关于javascript - Typescript:类型 '{}' 无法分配给类型 'Pick<T, K>' ,如何正确键入 javascript `pick` 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55137735/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com