泛型类型索引。TS2536:类型"字符串"不能用于索引类型"T"



如果您能提出以下方法的正确键入方式,我将不胜感激:

interface TestT {
[index: string]: any
}
function _defaultUpdateStateMutation<T extends TestT> (
state: T,
options: {
value: Object,
valueName: string
}
) {
const { value, valueName } = options
// TS2536: Type 'string' cannot be used to index type 'T'.
if (valueName) {
state[valueName] = value
} else if (value) {
Object.keys(value).forEach(valueName => {
state[valueName] = value[valueName]
})
}
}

TypeScript游乐场。

您必须告诉ts编译器valueName是T:的密钥

并将Object.keys(value)转换为Array<keyof T>

function _defaultUpdateStateMutation<T extends TestT> (
state: T,
options: {
value: any,
valueName: keyof T
}
) {
const { value, valueName } = options
if (valueName) {
state[valueName] = value
} else if (value) {
(Object.keys(value) as Array<keyof T>).forEach(valueName => {
state[valueName] = value[valueName]
})
}
}

PlayGroundLink

最新更新