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]>,但无效。

提香·切尔尼科娃·德拉戈米尔

您的选择是可以的,更简单的选择是根本不使用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]

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章