我的问题是双重的:
function foo<T is a string literal>(...)
。我最接近这种行为的是function foo<T extends string>
,但这允许字符串文字的联合和类型&#34;字符串&#34;本身作为T的值。我的用例是定义一个像这样的curried函数prop
:
function prop<K extends string, U>(name: K): <T extends { [P in K]: U }>(obj: T) => T[K] {
return (obj) => obj[name];
}
prop<'name', number>("name")({
name: 3
})
如果K
是字符串文字,则此示例按预期工作,但是细分K
的类型检查是string
。
我知道它有点做作;请不要我的目标不是解决一个实际问题(虽然它会)但更多的是尝试使用TypeScript的类型系统。
谢谢!
答案 0 :(得分:0)
我认为这里的问题在于您根据通用约束条件将购物车放在马前:在您知道对象之前尝试约束允许的密钥是没有意义的。
以下是我认为您正在尝试完成的示例:
function propGetter<O>(o: O): <K extends keyof O>(key: K) => O[K] {
return k => o[k];
}
let prop = propGetter({
id: 10,
firstName: "Dununuh Hunudunuh"
});
let id = prop("id"); // number
let firstName = prop("firstName"); // string
let foo = prop("foo"); // Type error