当前位置: 首页 > 知识库问答 >
问题:

javascript - 报错:'string' can't be used to index type 'HTMLAudioElement' 如何处理?

丘普松
2023-05-11

想动态的获取并修改 audio 的属性,

// let audio: HTMLAudioElement;
let property: string = fn(); // 获取 string 类型的属性名称
audio[property] = xxxxxx; // 赋值逻辑

vscode 报错:

Element implicitly has an 'any' type because expression of type 'string' can't be used to index type 'HTMLAudioElement'.
  No index signature with a parameter of type 'string' was found on type 'HTMLAudioElement'.

修改为:

audio[property as keyof HTMLAudioElement] = xxxxx; // 赋值逻辑

vscode 报错:

Cannot assign to 'CDATA_SECTION_NODE' because it is a read-only property.
Cannot assign to '一堆属性' because it is a read-only property.
......

这个如何处理呢?

共有3个答案

赏星河
2023-05-11
function isAudioProperty(property: string): property is keyof HTMLAudioElement {
  const audio = new Audio();
  return property in audio;
}

let property: string = fn(); 

if (isAudioProperty(property)) {
  audio[property] = xxxxxx; // 赋值
} else {
  console.error('Invalid property name:', property);
}
危砚
2023-05-11

你得理清楚逻辑,缺少类型的是 audio,所以你得想办法让 IDE 认出来它。

(audio as HTMLAudioElement)[property] = xxx;

当然也可能你赋值的属性不是标准属性,或者你的 fn() 缺少返回类型,那么你就应该去做对应的修复。或者使用 audio.setAttribute('key', value) 来修改属性。

屠兴旺
2023-05-11

通过

property as keyof HTMLAudioElement

强制转换类型后报错:

Cannot assign to '一堆属性' because it is a read-only property.

是因为不知道 audio[property] 中的 property 会是哪个属性,property 可能是某个 readonly 属性,不能给该属性赋值。

我的解决办法是根据自己的业务逻辑限制 property 的范围:

let property: 'currentTime' | 'volume' | 'playbackRate';

这样就不报错了

 类似资料:
  • js 代码如下 报错日志: ReferenceError: escodegen is not defined

  • window.URL 报错,提示 问题出现的原因: 我写了一个工具函数,该函数引入页面报错,通过排查发现是window.URL这一步导致的

  • (自己模拟的数据效果) 如上路径动画,目前的问题是运行的坐标数据是依照地图来的 需要转换为画布能够展示的范围,但运行数据之前差别大部分情况下都很小 我要怎样处理会合适一点? help大佬们

  • 问题内容: 由于弹出窗口 ,Selenium投掷出现问题 警报具有和按钮。我知道两种解决方法 第一种方法是重新打开一个新会话 第二种方法是使用Robot类 但是,这种方法不是省时的。有什么更好的办法吗? 问题答案: 这应该可以解决问题:

  • 问题描述 找到一个使用 Canvas + WebFont 绘制的报错页面,但是示例代码运行会报错。 相关代码 主页代码 css js 你期待的结果是什么?实际看到的错误信息又是什么? 可见控制台报错 求助大伙儿帮忙看看问题在哪,如何解决,顺便说一下问题的解决思路,谢谢