我正在尝试用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中排除任何其他类型...
答案 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
}