【发布时间】:2020-03-19 00:53:43
【问题描述】:
给定一个带有接口的变量:
interface Model {
textField?: string;
hasMeaning: boolean;
percentage: number;
readonly someMap: {
[key: string]: string;
};
getMeSomething(code: string): string;
}
let model: Model;
我想在这个函数中分别检查键名和值类型:
const setField = (fieldName: WritableKeysOf<Model>, fieldValue: Model[WritableKeysOf<Model>]) => {
model[fieldName] = fieldValue;
}
所以当我这样使用它时:
setField('textField', 1);
setField('non-existant', true);
setField('someMap', { 'it': 'does not matter' });
我收到错误,但这些不会有问题:
setField('textField', undefined);
setField('percentage', 2);
setField('getMeSomething', code => code + 'suffix');
我想实现:
-
fieldName应该匹配任何接口道具名称,但与readonly匹配 ✔️ -
fieldValue应匹配界面中任何可能的类型,但与readonly匹配的类型 ✔️ - 将两者结合起来,这样我就可以设置一个值而不会出错❌
我发现了一些技巧来删除readonly 并正确获取两个参数的类型,但由于某种原因,model[fieldName] 现在是never。也许我可以使用一些泛型来告诉我到底要检查哪个接口道具?
【问题讨论】:
-
setField<T extends WritableKeysOf<Model>>(key: T, value: Model[T])
标签: typescript interface