【发布时间】:2019-06-15 19:12:41
【问题描述】:
抱歉,如果这在某处重复,我的 google-fu 未能找到正确的词来缩小结果范围。
我正在尝试创建一个辅助函数来重用某些功能,但无法完全弄清楚是否/如何实现它。
给定一个具有泛型的函数(或类型),其中一个参数是指定泛型类型的键,函数返回类型被确定为泛型类型上该特定属性的返回类型,而不是泛型类型上的每个属性类型。
interface MyObject {
readonly foo: Date;
readonly bar: number;
readonly wizz: string;
readonly bang: boolean;
}
function getHelpers<ItemType>(key: keyof ItemType) {
return (item: ItemType) => item[key];
}
const res = getHelpers<MyObject>('bang');
// Has type of `(item: MyObject) => string | number | boolean | Date`, when I need it to have `(item: MyObject) => boolean`
我知道如果我添加一个辅助泛型参数来缩小键类型,那么它就可以工作:
function getHelpers<ItemType, KeyType extends keyof ItemType>(key: KeyType) {
return (item: ItemType) => item[key];
}
const res = getHelpers<MyObject, 'bang'>('bang'); // Has typed of `(item: MyObject) => boolean`
但如果可能的话,我宁愿不必在每次调用函数时都通过指定通用参数来复制键。
【问题讨论】:
-
'bang'(在getHelpers<MyObject>('bang')中)将永远是一个文字,对吧?从来没有运行时值? -
这是一个真的有趣的问题。
-
这不是那些 UnionToIntersection 类型的案例之一吗?并不是说我有一个特定的解决方案...... :) 但它基本上是关于确保类型参数只是一个键而不是键的联合,对吧?
-
@T.J.Crowder 是的,总是一个字面意思,至少在我想做的事情上
标签: typescript