gpt4 book ai didi

javascript - typescript 错误 :Type 'number' is not assignable to type 'never'

转载 作者:行者123 更新时间:2023-12-05 02:07:34 24 4
gpt4 key购买 nike

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 playground上修改错误: here

typescript :v3.8.3错误:类型“number” 不可分配给类型 never。我不明白为什么它是 never 类型。

最佳答案

您收到该错误是因为 TypeScript 无法推断出 this.opts[key]opts[key]是同一类型。如果你要掩盖 = 的每一半:

  • opts[key]可能是 Function , null , boolean , 或 number
  • this.opts[key]需要收到 Function , null , boolean , 或 number取决于 key 的值,我们不知道
  • Function 的唯一共同父类(super class)型, null , boolean , 和 numbernever ,所以这就是 TypeScript 想要的类型 this.opts[key]

有趣的是,如果您要将其提取为匿名泛型函数,它会起作用:在单个赋值中,Typescript 可以推断并使用类型 Opts[K] . jcalzthis similar question 中提出了类似的解决方案.

if (typeof opts[key] !== "undefined") {
// this.opts[key] = opts[key];
(<K extends keyof Opts>(k: K) => { this.opts[k] = opts[k]; })(key);
}

typescript playground

也就是说,我会像 Mukesh Soni's answer 那样使用展开运算符, 结束你对 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 spread vs. Object.assign ,其中指出解决方案非常相似,并且都适用于默认选项值。

关于javascript - typescript 错误 :Type 'number' is not assignable to type 'never' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61671898/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com