Вы получаете эту ошибку, потому что TypeScript не может сделать вывод, что this.opts[key]
и opts[key]
относятся к одному типу. Если бы вы должны были покрыть каждую половину =
:
opts[key]
могло бы быть Function
, null
, boolean
или number
this.opts[key]
должен получить Function
, null
, boolean
или number
в зависимости от значения key
, которого мы не знаем - единственный общий супертип для
Function
, null
, boolean
и number
это never
, так что это тип, который TypeScript хочет для this.opts[key]
Интересно, если бы вы извлекли это с анонимной функцией generi c, она работает: в рамках одного присваивания Typescript может вывести и использовать тип Opts[K]
. jcalz предлагает аналогичное решение в этот аналогичный вопрос .
if (typeof opts[key] !== "undefined") {
// this.opts[key] = opts[key];
(<K extends keyof Opts>(k: K) => { this.opts[k] = opts[k]; })(key);
}
игровая площадка машинописного текста
Тем не менее, я бы используйте оператор распространения, как в Muke sh Soni, ответ , завершив присвоение this.opts
...opts
, или используйте Object.assign
. Существует небольшой риск того, что переданный opts
содержит дополнительные ключи, но Typescript должен гарантировать обратное во время компиляции. (В этом отношении, если вы ожидаете, что opts
будет необязательным и потенциально неполным, его, вероятно, следует определить как opts?: Partial<Opts>
.)
class NES {
constructor(opts?: Partial<Opts>) {
this.opts = Object.assign({
onFrame() { },
onAudioSample: null,
emulateSound: true,
sampleRate: 44100,
}, opts);
}
opts: Opts
}
См. Также: Разброс объекта по сравнению с Object.assign , в котором отмечается, что решения очень похожи и оба применимы для значений параметров по умолчанию.