如何在打字稿中正确地连接对象的功能?

时间:2019-01-22 05:10:18

标签: typescript typescript-typings

我正在使用的一个库中抛出很多TS错误。它使用Object函数。

我有多个TS错误:

error TS2339: Property 'random' does not exist on type 'Object'.
error TS2339: Property 'isArray' does not exist on type 'Object'.
error TS2339: Property 'defineProperties' does not exist on type 'Object'.
error TS2339: Property 'defineProperty' does not exist on type 'Object'.

所以我创建了一个对象接口,现在我需要定义所有使用的函数以及它的类型。我在玩函数和对象类型。 Window元素似乎正常工作,但Object元素却无效。

interface Window {
  Array: Object,
  Object: Object,
  WeakMap: Object,
  Symbol: Object,
  Math: Object,
}

interface Object {
  random: Function,
  isArray: Function,
  defineProperties: Function,
  defineProperty: Function,
  create: Function,
  keys: Function,
  for: Function,
  iterator: Function,
  asyncIterator: Function,
}
declare var window: Window
declare var object: Object

现在出现错误(15个错误):

index.ts(1432,43): error TS2538: Type 'Object' cannot be used as an index type.
index.ts(1725,23): error TS2349: Cannot invoke an expression whose type lacks a call signature. Type 'Object' has no compatible call signatures.

尝试使用任何类型都会导致类似的错误,但计数更少(7个错误):

interface Object {
  [index: string]: any
}


error TS2349: Cannot invoke an expression whose type lacks a call signature. Type 'Object' has no compatible call signatures.

其中一行:

if (!isValidElement(element) && ObjectHasOwnProperty.call(Object(element), 'default'))

我敢肯定有更好的方法可以做到这一点。 它是JS文件中包含的第三方库。我用// @ts-ignore删除了一些TS错误,但是我需要在每行上添加它,这很痛苦,ts-ignore-start尚未实现(https://github.com/Microsoft/TypeScript/issues/19573

1 个答案:

答案 0 :(得分:0)

Objectfundamental objects in JavaScript(也是TypeScript)之一,您不应该尝试重新定义它:将自定义接口命名为Object不是一个好主意。

事实上,您希望整个代码库上的@ts-ignore应该引起您警觉。

我不知道您如何在TS项目中包含第三方JS,但是从您发布的代码段中我可以看到,在TypeScript代码中,您从对象中(从库中)获取了一个具有属性random的对象,isArray等...,并声明其为Object类型。当您尝试在其上调用方法时,TS编译器会抱怨JS嵌入式Object没有这样的成员。您应该重命名您创建的自定义接口(包含randomisArray等的接口),使其不具有名称Object,并将其用作该对象的类型,您尝试使用的属性。另外,您应该对该接口的所有成员应用正确的类型(TS编译器会抱怨使用Function)。

或者(我认为这可能是导入JS代码时要走的路),尝试将导入的对象声明为any,并且TypeScript编译器在使用其任意属性时不会抱怨。