输入值类型的打字稿键

时间:2018-10-08 12:03:19

标签: typescript typing

我正在尝试用Typescript写一个函数,该函数需要:

  • 具有至少一个X类型的成员的对象(在此示例中:boolean)
  • 指向该值的对象的键
      

    (例如{someValue: true}-> key =“ someValue”)

目前,我的方法如下:

function myFunction<
    T extends Record<K, boolean>, // the type of the object
    K extends keyof T, // the key which points to X
>(
    obj: T,
    objKey: K,
) {
    const x: boolean = obj[objKey];
}

只要我只需要该对象的类型为T而没有其他类型,就可以使用。但是,我现在需要一个同时实现T(具有布尔成员的对象)和AdditionalData的对象。但是,如果我将T extends Record<...>替换为T extends Record<...> & AdditionalData,则类型检查当然会失败。

我想到的解决方案是引入另一个通用类型L,该通用类型仅包含来自SomeInterface的数据,并使K依赖于此:

function myFunction<
    L extends Record<K, boolean>, // the type containing the boolean value
    K extends keyof L, // the key which points to X,
    T extends L & AdditionalData, // the type of the object
>(...) {}

但是,这也不起作用。

是否有任何方法可以将键所指向的值强制为特定类型?

编辑:或者,是否可以从keyof中排除特定值?这样,我可以从K中排除任何其他类型...

1 个答案:

答案 0 :(得分:1)

Typescript对于泛型参数类型字段的类型并不总是很合理。我不确定是什么原因导致它无法识别obj[objKey]boolean的事实,但是简单的解决方法是使用一个额外的变量:

interface AdditionalData {
    a: number,
    b: string
}

function myFunction<
    T extends Record<K, boolean> & AdditionalData, // the type of the object
    K extends keyof T, // the key which points to X
>(
    obj: T,
    objKey: K,
) {
    const o : Record<K, boolean>= obj; // assignable
    const x: boolean = o[objKey]; // access works ok
}
相关问题