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

时间:2016-12-10 19:47:36

标签: typescript typescript2.0

我的问题是双重的:

  1. 我想知道TypeScript中是否有一种方法可以将泛型约束为某种类型的文字类型。我的意思是function foo<T is a string literal>(...)。我最接近这种行为的是function foo<T extends string>,但这允许字符串文字的联合和类型&#34;字符串&#34;本身作为T的值。
  2. 如果在TypeScript 2.1中无法做到这一点,那么从设计的角度来看,实现这样的功能是否有意义?
  3. 我的用例是定义一个像这样的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的类型系统。

    谢谢!

1 个答案:

答案 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