将泛型类型约束为文字类型

Aeg*_*gis 5 typescript typescript2.0

我的问题有两个:

  1. 我想知道 TypeScript 中是否有一种方法可以将泛型限制为某种文字类型。我的意思是这样的function foo<T is a string literal>(...)。我最接近这种行为的是function foo<T extends string>,但这允许字符串文字和类型“string”本身作为 T 的值的联合。
  2. 如果这在 TypeScript 2.1 中不可能实现,那么从设计角度来看实现这样的功能是否有意义?

我的用例是定义一个柯里化函数,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
})
Run Code Online (Sandbox Code Playgroud)

K如果是字符串文字,则此示例按预期工作,但函数类型的类型检查K会失败string

我知道这有点做作;请注意,我的目标不是解决实际问题(尽管它会),而是更多地尝试 TypeScript 的类型系统。

谢谢你!

Asa*_*din 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
Run Code Online (Sandbox Code Playgroud)