typescript - 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]>
,但它无效。
解决方案
您的选择是好的,一个更简单的选择是根本不使用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]
)
推荐阅读
- r - 在 R 中定义和实现接口
- django - 使用 vue.js 请求时,Django RetrieveDestroyAPIView 无法正常工作
- java - 在线程池中获取任务拒绝错误
- android - AsyncTask 总是在运行并且没有完成
- java - 如何定期运行不同的脚本,但通过在远程服务器上运行命令
- c# - 我想使用 iTextSharp 在 PDF 中显示 GUJARATI 字体,我该怎么做?
- html - 如何在 Bootstrap 中删除选择框的圆角?
- ios - iOS - 手机锁定时显示视图
- python-3.x - 使用 pip3 安装 spacy 时出错
- git - 连接多个 Repos 的 Git History