TypeScript 在JS中,对象被视为'任意类型',

nwnhqdif  于 4个月前  发布在  TypeScript
关注(0)|答案(9)|浏览(40)

TypeScript版本: 3.0.0-dev.20180711
代码

/** @typedef {object} T */
/** @type {T} */
const x = 0;

预期行为:

x 处报错:0 不是一个对象。

实际行为:

没有报错。

0qx6xfy6

0qx6xfy61#

我认为这是将Object/object当作任何对象处理的结果。例如,/** @typedef {{}} T */会产生错误。

blmhpbnm

blmhpbnm2#

getTypeFromTypeNode中,我们有:

case SyntaxKind.ObjectKeyword:
    return node.flags & NodeFlags.JavaScriptFile ? anyType : nonPrimitiveType

这个特性最初是在#17082中添加的。我们可以重新审视这个决定,但在我看来,不区分大小写的原始类型和Object as any都是不错的选择。

zzoitvuj

zzoitvuj3#

解决方案可能是添加一种新类型,它与ts的object完全相同,无论它出现在哪种文件中。

zbwhf8kr

zbwhf8kr4#

也许在lib.d.ts文件中可以找到type NonPrimitive = object?

agxfikkp

agxfikkp5#

可以被关闭为固定的#35661吗?

8ljdwjyq

8ljdwjyq6#

可能。#35661仅在noImplicitAny: true时适用。

hrirmatl

hrirmatl7#

我希望在JSDoc中可以使用object类型,而不需要启用noImplicitAny

lmvvr0a8

lmvvr0a88#

@ExE-Boss,你可以在自己的d.ts文件中使用type NonPrimitive = object。不幸的是,许多现有的JS代码使用object来表示anyunknown,即使像webpack这样的项目也会定期使用TypeScript进行编译。

of1yzvn4

of1yzvn49#

我本人一直在使用:

/** @typedef {(typeof Object.create) extends (arg0: infer T, ...args: any) => any
? (T extends null | undefined ? never : T) : never} obj */

这是内联形式的:

/** @typedef {NonNullable<Parameters<typeof Object.create>[0]>} obj */

相关问题