首页 > 解决方案 > 如何更改 Typescript 中字段的类型?

问题描述

我需要 Typescript 中的一个函数,该函数将对象作为参数并将值分配给该对象的某个属性,但该值的类型将与原始对象不同。

因此,例如,当{x: boolean, y: number}我想将一个类型的对象分配'Hello World'给 fieldy时,这当然是不可能的,因为 y 是 a number,但是在高级类型的帮助下,我可以构建一个 workarround。

// Change the type
type ChangeType<Of, To, Where extends keyof Of> = {
    [K in keyof Of]: K extends Where ? To : Of[K]
}

使用ChangeType我可以像这样更改对象:

//                          Of               To    Where
let x: ChangeType<{x: boolean, y: number}, string, 'y'> = { 
    x: true, 
    y: 'Hello World'
}

现在我想将它概括为一个通用函数,这就是我尝试过的:

let change = <T, U, Condition extends keyof T>(entity: T, new_value: U, property: Condition): ChangeType<T, U, Condition> => {
    return {...entity, [property]: new_value}
}

但我收到以下类型错误:

输入 'T & { [x: string]: U; }' 不可分配给类型 'ChangeType'.ts(2322)

那么如何以通用方式更改对象字段的类型?

标签: typescripttypes

解决方案


推荐阅读