Учитывая переменную с интерфейсом:
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
. Может быть, я мог бы использовать какие-нибудь обобщения, чтобы определить, какую именно опору интерфейса я хочу проверить?