gpt4 book ai didi

pluck 的 TypeScript 定义

转载 作者:搜寻专家 更新时间:2023-10-30 21:06:50 26 4
gpt4 key购买 nike

TypeScript documentation给出了以下使用“索引类型”(稍作修改)定义 pluck 函数的示例:

function pluck<T, K extends keyof T>(o: T, name: K): T[K] {
return o[name];
}

这显然被称为

pluck({a: 1}, 'a')

但是,我想定义一个pluck,它只接受一个属性名,并产生一个函数,我可以将其应用于对象以获取该属性,如

const getA = pluck('a');
getA({a: 1})

我尝试了以下方法:

function pluck<T, K extends keyof T>(p: K) {
return function(o: T): T[K] {
return o[p];
};
}

这个编译很好,但是当我尝试使用它时:

const a = {a: 1};
const getA = pluck('a');
console.log(getA(a));

我得到了错误

Argument of type '"a"' is not assignable to parameter of type 'never'. [2345]

在我调用 pluck('a') 的那一行。有什么办法可以做我想做的事吗?

最佳答案

您可以通过将 T 类型定义移动到内部函数并为其定义约束来实现此目的:

function pluck<KeyType extends string>(p: KeyType) {
return function <T extends Record<KeyType, any>>(o: T): T[KeyType] {
return o[p];
};
}

const getA = pluck('a');

const a = { a: 1 };
console.log(getA(a));

const b = { b: 1 };
console.log(getA(b)); //error

关于pluck 的 TypeScript 定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46068274/

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