【问题标题】:TypeScript declare var error for object.property - what to do?TypeScript 为 object.property 声明 var 错误 - 怎么办?
【发布时间】:2020-01-11 10:13:52
【问题描述】:

SO 中建议了多种方法来动态导入外部脚本,例如“https://something.com/...js”。问题是 TypeScript 不知道这些属性,因此会出错。

作为 TS 提供的解决方法

declare var someObject

您可以将您从外部来源检索到的对象放入其中。这有效,没有错误。但是,它不适用于

let variable = someObject.property

该属性会出错,因为 TS 不知道您的对象中有什么。

有人解决了吗?

这是我的一些实际代码,它不起作用。错误是

Property createUploadWidget does not exist on type 'Scripts' 
interface Scripts {
  name: string;
  src: string;
}

declare var CloudinaryScripts: Scripts;

CloudinaryScripts =
  {name: 'upLoader', src: 'https://widget.cloudinary.com/v2.0/global/all.js'};

export class CloudinaryComponent {
  ...
  private uploadWidget = CloudinaryScripts.createUploadWidget(
    {
      cloudName: ...
}

另外,这会产生一个很大的错误:

CloudinaryScripts[createUploadWidget]

【问题讨论】:

  • 甚至没有接近副本。
  • Stackblitz 无法识别声明。找不到变量:CloudinaryScripts。如果我删除声明,该错误就会消失,但问题会更糟。
  • 您对数组的看法是正确的,所以我删除了括号。我一直在尝试许多关于导入的 SO 建议,并留下了一个工件。不过问题没有变化。
  • 即使在最初的问题解决之后,这在 Angular 中也不起作用。当组件初始化时,类主体中的 CloudinaryScripts 会引发“未定义”错误。它不明白 var 已为 TypeScript 声明。声明在类的主体中不起作用,它必须在它之上。如果我将声明移到正文中并在构造函数、OnInit 或 AfterViewInit 中对其进行初始化,那么它会因其他问题而失败。似乎没有什么好的解决方法,但如果我找到了,我会将其添加到答案中。

标签: angular typescript


【解决方案1】:

您可以通过将其定义为 any 来绕过该错误

declare var someObject: any

你得到的错误是正确的

“脚本”类型上不存在属性 createUploadWidget(仅存在名称和 src)

interface Scripts {
  name: string;
  src: string;
}

【讨论】:

  • any更好的当然是指定实际类型(如果已知)。
  • 为了更清晰,我添加了我的实际代码设置。我已经按照你的建议做了,但问题是关于属性的,除了 ts ignore 之外,TS 似乎没有其他解决方案。这是一种黑客行为。
  • @Preston“而且 TS 似乎除了 ts ignore 没有其他解决方案”是不正确的。它提供了一个完整的类型系统,用于声明您使用的所有内容的类型。
  • 你是对的,昨天我在努力解决这个问题时就这样做了。它导致了该属性的其他一些错误,所以我追着我的尾巴把它移走了。我没有做的是删除我在 SO 上遵循的示例中的数组。所以你的答案有效。删除数组并只保留一个对象,并将属性添加到类型为 any 的接口中,并将属性添加到值为 null 的 Script 对象中。谢谢!
  • CloudinaryScripts = {name: 'upLoader', src: 'https://widget.cloudinary.com/v2.0/global/all.js', createUploadWidget: null};
猜你喜欢
  • 2014-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-19
  • 2018-08-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多