我正在使用的一个库中抛出很多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)
答案 0 :(得分:0)
Object
是fundamental objects in JavaScript(也是TypeScript)之一,您不应该尝试重新定义它:将自定义接口命名为Object
不是一个好主意。
事实上,您希望整个代码库上的@ts-ignore
应该引起您警觉。
我不知道您如何在TS项目中包含第三方JS,但是从您发布的代码段中我可以看到,在TypeScript代码中,您从对象中(从库中)获取了一个具有属性random
的对象,isArray
等...,并声明其为Object
类型。当您尝试在其上调用方法时,TS编译器会抱怨JS嵌入式Object
没有这样的成员。您应该重命名您创建的自定义接口(包含random
,isArray
等的接口),使其不具有名称Object
,并将其用作该对象的类型,您尝试使用的属性。另外,您应该对该接口的所有成员应用正确的类型(TS编译器会抱怨使用Function
)。
或者(我认为这可能是导入JS代码时要走的路),尝试将导入的对象声明为any
,并且TypeScript编译器在使用其任意属性时不会抱怨。