typescript - 如何在 TypeScript 中键入函数参数以映射对象属性?
问题描述
我试图了解如何正确地将类型设置为prop
和value
函数参数(请参阅??
),以便 prop 和 value 必须与MyStorage
接口中定义的相匹配。设置keyof MyStorage
应该足以正确键入prop
,但是我完全不知道如何键入value
。
interface MyStorage {
prop1?: string;
prop2?: number;
prop3?: boolean;
prop4?: Array<string>;
prop5?: 'value1' | 'value2';
}
const myStorage: MyStorage = {};
const setProp = (prop: ??, value: ??) => {
myStorage[prop] = value;
}
setProp('prop1', 'Ok');
setProp('prop1', 5); // Not Ok
setProp('prop5', 'value1'); // Ok
setProp('prop5', 'value5'); // Not Ok
最终目标是将此函数转换为这样的通用版本:
const genericSetProp = <T>(prop: ??, value: ??, storage: T) => {
storage[prop] = value;
}
genericSetProp('prop1', 'Ok', myStorage);
genericSetProp('prop1', 5, myStorage); // Not Ok
genericSetProp('prop5', 'value1', myStorage); // Ok
genericSetProp('prop5', 'value5', myStorage); // Not Ok
如何设置这些类型以使 TypeScript 正确检查这些参数?
解决方案
您可以通过执行等操作来使用结构成员的类型MyStorage["prop1"]
。要获取该"prop1"
部分,您可以要求key
be keyof MyStorage
。所以第一个版本看起来像这样:
const setProp = <K extends keyof MyStorage>(prop: K, value: MyStorage[K]) => {
myStorage[prop] = value;
};
您确实可以通过MyStorage
使用第二个泛型类型参数从第三个参数推断类型来使该泛型:
const genericSetProp = <T, K extends keyof T>(prop: K, value: T[K], storage: T) => {
storage[prop] = value;
};
推荐阅读
- javascript - Chkeditor 文本/背景颜色框在引导模式中不可见
- drupal-7 - drupal 7中新添加的字段类型的问题
- amazon-cloudformation - 仅使用 CloudFormation 分配公共 IP
- shopware - 插件日志文件未写入
- mongodb - Mongodb:在聚合集合时为每个文档添加新的子文档
- php - Mysql 仅原始计数
- ios - 如何在 Objective-C 中将完成处理程序分配给另一个
- javascript - React:NextJS,我需要 2 台服务器进行部署吗?
- ios - 如何在 iOS 中解码 \\u00e2\\u0080\\u0099
- django - 在 Django 中维护两个不同的模型模式版本以连接两个不同的数据库