【发布时间】:2021-09-03 12:54:11
【问题描述】:
这个问题让我很困惑,我什至不知道如何正确命名这个问题。
几个小时前我开始学习 TypeScript,但遇到了 Property 'whatever' does not exist on type 'object'. 智能感知错误。
我觉得我应该为这个对象声明一个定义相关属性的接口,但感觉不对,因为该对象是一个事件侦听器参数,所以我不直接调用该函数 -我正在使用的图书馆确实如此。它也感觉像一个我只会使用一次的东西的界面是多余的。
让我告诉你我的意思:
// this event listener is created by the library I'm using, so I can't change the params it sends
this.load.on('fileprogress', (file: object) => {
console.log(`Loading asset: ${file.key}`); // ".key" is crapping out with "Property 'key' does not exist on type 'object'."
});
最简单的解决方案似乎只是使用(file) => {...},以便默认输入any,但我想避免这种情况,否则我还不如回到使用普通的旧JavaScript。我想出的下一件事是在事件侦听器上方声明interface File { key: string },然后将函数更改为(file: File) => {...},但这感觉像是一种黑客行为,因为就像我说的那样,我不是调用这个函数的人并且有零控制实际上作为参数发送的内容。此外,整个interface File... 感觉过于冗长。
我在想,沿着接口线,是不是有一些方法可以在参数列表中内联声明属性的类型。像(file: object { key: string }) 这样的东西?如果我们从字面上看它是一个内联接口,这仍然是一个 hack,但至少我们现在告诉它该对象应该具有哪些属性,对吧?
我想出的一个不会引发智能感知错误的事情是这个怪物 (file: {[key: string]: any} = {}) => {},但又是一个可怕的 any 关键字,智能感知将其报告为......好吧,我不甚至知道它应该是什么。这是截图。
我想我要问的底线问题是处理这种情况的正确方法是什么,您不直接调用的函数需要接收具有您无法预测的属性的对象,因此可以'不定义?
【问题讨论】:
标签: javascript typescript types