interface Opts {
onFrame: () => void;
onAudioSample: null;
emulateSound: boolean;
sampleRate: number;
}
class NES {
constructor(opts: Opts) {
this.opts = {
onFrame() { },
onAudioSample: null,
emulateSound: true,
sampleRate: 44100,
}
if (typeof opts !== "undefined") {
let key: keyof Opts
for (key in this.opts) {
if (typeof opts[key] !== "undefined") {
// got err here
this.opts[key] = opts[key];
}
}
}
}
opts: Opts
}
您可以在TS游乐场检查错误:这里
打字稿:v3.8.3err: Type 'number'
不可分配给type never
。我不明白为什么它是一种never
类型。
你得到的是错误的,因为打字稿不能推断this.opts[key]
和opts[key]
属于同一类型。如果您要掩盖每个方面=
:
opts[key]
可能是Function
,null
,boolean
,或number
this.opts[key]
需要接收Function
,null
,boolean
,或number
依赖于价值key
,这是我们不知道Function
,null
,boolean
,和number
是never
,不过就是这样打字稿想要的类型this.opts[key]
有趣的是,如果要将其提取到匿名泛型函数中,它将起作用:在单个分配中,Typescript可以推断和使用type 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);
}
就是说,我将像Mukesh Soni的答案一样使用散布运算符,结束对this.opts
with...opts
或use的分配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 spread与Object.assign,它指出解决方案非常相似,并且都适用于默认选项值。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句