gpt4 book ai didi

typescript - 将 Type 约束为 keyof T 并且为特定类型

转载 作者:行者123 更新时间:2023-12-04 10:55:43 31 4
gpt4 key购买 nike

考虑

export function sortByProp<T extends Record<string, any>>(propName: keyof T) {
return sort((a, b) => a[propName].localeCompare(b[propName]))

我想确保 propName也是一种 string
结果是

Property 'localeCompare' does not exist on type 'unknown'.ts(2339)



这是如何实现的?

好的,这让我更进一步:
export const sortByProp = <T extends Record<string, any>>(propName: keyof T) => {
return sort<T>((a, b) => a[propName].localeCompare(b[propName]))
}

消耗
 sortByProp('hostname')(data.devices.devicePageEntries).map(x => ({
key: x.id,
value: x.hostname,
}))

但后来我得到

Property 'id' does not exist on type '{ hostname: any; }



在我的调用者方法中进行转换似乎可以解决问题,
 (sortByProp('hostname')(
data.devices.devicePageEntries,
) as DevicePageEntry[])

我在 Ramda 0.25.0

最佳答案

这是一个可能的解决方案:

import { sort } from "ramda";

export function sortByProp<K extends string>(propName: K) {
return <T extends Record<K, string>>(arr: T[]) =>
sort((a: T, b: T) => a[propName].localeCompare(b[propName]))(arr);
}

const result = sortByProp("hostname")([
{ hostname: "foo", id: 1 },
{ hostname: "bar", id: 2 }
]);
// [{"hostname":"bar","id":2},{"hostname":"foo","id":1}]

const mappedResult = result.map(x => ({
key: x.id, // works
value: x.hostname
}));
// [{"key":2,"value":"bar"},{"key":1,"value":"foo"}]
Code sample on StackBlitz
我声明了类型参数 T有约束 extends Record<K, string>确保, localeCompare总是在 string 上调用适当的值(value)。
此外,编译器无法推断 generic type parameter 的属性值类型。 T仅查看函数参数 propName: keyof T ,所以需要 any来自 Tbase constraint Record<string, any> .进一步的原因是: Inference candidatesT通过查看函数声明签名(参数和返回类型)而不是函数体/实现来收集。 TypeScript 也只能直接引用 T可能的候选者的带注释的函数,而不是内部函数声明。
通过声明 T作为内部函数的一部分,TypeScript 可以使用函数参数 arr: T[]推断 T .
替代 sort纯JS
function sort<T>(cb: (t1: T, t2: T) => number) {
return (arr: T[]) => [...arr].sort(cb);
}
Playground

关于typescript - 将 Type 约束为 keyof T 并且为特定类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59215432/

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