首页 > 解决方案 > TypeScript 泛型类型推断

问题描述

我有一个包含一些字段的对象,我将实现一个更新函数,它可以修改我的对象中现有键的值。如何限制函数只接受对象中存在的键,并且新值的类型必须与原始值相同。

const defaultData = {
    name: '',
    count: 0,
    desc: '',
    visited: false,
};

type DataType = typeof defaultData;
type Keys = keyof DataType;

let data = Object.assign({}, defaultData);

// after tried, I found out this works. But not quite understand it
function updateData<T extends Keys, P extends DataType[T]>(k: T, value: P){
    data[k] = value;
}

updateData('name', 'hehe');
updateData('count', false);

我想知道这是否是定义函数的唯一方法。updateData是什么P extends DataType[T]?我尝试使用<T extends Keys, P = DataType[T]>,但它无效。

标签: typescript

解决方案


您的选择是好的,一个更简单的选择是根本不使用Ptype 参数,因为我们不关心传入的实际类型,我们只关心与以下内容兼容DataType[T]

function updateData<T extends Keys>(k: T, value: DataType[T]){
    data[k] = value;
}

P extends DataType[T]有效而无效的原因P = DataType[T]是它们做的事情非常不同。P extends DataType[T]意味着P需要是 的子类型DataType[T]P = DataType[T]表示如果P无法推断,DataType[T]则应使用(但P可以是任何类型,不一定是 的子类型DataType[T]


推荐阅读