我有一个带有某些字段的对象,并且我将实现一个更新功能,该功能可以修改对象中存在的键的值。如何限制该函数只接受对象中存在的键,并且新值的类型必须与原始值相同。
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]>
,但无效。
您的选择是可以的,更简单的选择是根本不使用P
type参数,因为我们不在乎传递的实际类型,我们只在乎与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] 删除。
我来说两句