打字稿错误:无法将“数字”类型分配给“从不”类型

橙子
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]可能是Functionnullboolean,或number
  • this.opts[key]需要接收Functionnullboolean,或number依赖于价值key,这是我们不知道
  • 只有在公用超类型为Functionnullboolean,和numbernever,不过就是这样打字稿想要的类型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.optswith...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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

打字稿错误::类型'数字'不能分配给类型'从不'

无法将“数字”类型分配给“日期”类型-无法编译打字稿

打字稿:无法分配给类型错误

打字稿错误“无法将类型参数分配给类型参数”

在反应打字稿中,“字符串”类型不可分配给“从不”类型,“未知”类型不可分配给“从不”类型错误

打字稿:“不可分配给从不类型的参数”错误

映射期间无法将类型'{}'分配给类型'object []'并减少打字稿中的类型

React Component上的打字稿错误:无法将'Element'类型的参数分配给该类型的参数

打字稿错误:无法将类型'number'的参数分配给'Expected <Promise <number >>'类型的参数

打字稿错误:“ undefined []”类型无法分配给“ void”类型

打字稿错误:“对象”类型的参数无法分配给“ {} []”类型的参数

打字稿错误:类型Observable <Object>无法分配给类型

减少数组功能的打字稿错误-无法将“字符串”分配给类型的参数

类型“ any”的参数不能分配给“从不”类型的参数打字稿解决方案

打字稿中的“无法分配给永不类型的参数”错误是什么?

类型错误:无法分配给打字稿中对象“[object Array]”的只读属性“0”

打字稿中这种复杂的“无法分配给类型”错误的解释

打字稿错误:setInterval-类型“计时器”不可分配给类型“数字”

打字稿,已修复。“字符串”类型不可分配给“数字”类型

打字稿类型“T”不可分配给“数字”类型

无法将字符串值分配给打字稿枚举(初始化程序类型的字符串不可分配给变量类型)

打字稿-类型'假'不能分配给类型'真'

Angular2错误:无法将类型“数字”分配给类型“ NumberConstructor”

错误:无法通过toFixed()将类型“字符串”分配给类型“数字”

输入'{数据:数字;}' 不可分配给打字稿中的类型 '(obj: any) => any' 错误

打字稿错误:类型'{道具:IDrink; }' 不可分配给类型 'IntrinsicAttributes & IDrink'

打字稿错误:类型的“this”上下文......不可分配给方法的“this”类型

输入'字符串| string[]' 不能分配给类型 'string' - 打字稿类型错误

收到打字稿错误:类型'any []'不能分配给'never []'类型。TS2345