TypeScript版本: 3.0.0-dev.20180711代码
/** @typedef {object} T */ /** @type {T} */ const x = 0;
预期行为:
在 x 处报错:0 不是一个对象。
x
0
实际行为:
没有报错。
0qx6xfy61#
我认为这是将Object/object当作任何对象处理的结果。例如,/** @typedef {{}} T */会产生错误。
/** @typedef {{}} T */
blmhpbnm2#
在getTypeFromTypeNode中,我们有:
getTypeFromTypeNode
case SyntaxKind.ObjectKeyword: return node.flags & NodeFlags.JavaScriptFile ? anyType : nonPrimitiveType
这个特性最初是在#17082中添加的。我们可以重新审视这个决定,但在我看来,不区分大小写的原始类型和Object as any都是不错的选择。
zzoitvuj3#
解决方案可能是添加一种新类型,它与ts的object完全相同,无论它出现在哪种文件中。
object
zbwhf8kr4#
也许在lib.d.ts文件中可以找到type NonPrimitive = object?
type NonPrimitive = object
agxfikkp5#
可以被关闭为固定的#35661吗?
8ljdwjyq6#
可能。#35661仅在noImplicitAny: true时适用。
noImplicitAny: true
hrirmatl7#
我希望在JSDoc中可以使用object类型,而不需要启用noImplicitAny。
noImplicitAny
lmvvr0a88#
@ExE-Boss,你可以在自己的d.ts文件中使用type NonPrimitive = object。不幸的是,许多现有的JS代码使用object来表示any或unknown,即使像webpack这样的项目也会定期使用TypeScript进行编译。
any
unknown
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 */
9条答案
按热度按时间0qx6xfy61#
我认为这是将Object/object当作任何对象处理的结果。例如,
/** @typedef {{}} T */
会产生错误。blmhpbnm2#
在
getTypeFromTypeNode
中,我们有:这个特性最初是在#17082中添加的。我们可以重新审视这个决定,但在我看来,不区分大小写的原始类型和Object as any都是不错的选择。
zzoitvuj3#
解决方案可能是添加一种新类型,它与ts的
object
完全相同,无论它出现在哪种文件中。zbwhf8kr4#
也许在lib.d.ts文件中可以找到
type NonPrimitive = object
?agxfikkp5#
可以被关闭为固定的#35661吗?
8ljdwjyq6#
可能。#35661仅在
noImplicitAny: true
时适用。hrirmatl7#
我希望在JSDoc中可以使用
object
类型,而不需要启用noImplicitAny
。lmvvr0a88#
@ExE-Boss,你可以在自己的d.ts文件中使用
type NonPrimitive = object
。不幸的是,许多现有的JS代码使用object
来表示any
或unknown
,即使像webpack这样的项目也会定期使用TypeScript进行编译。of1yzvn49#
我本人一直在使用:
这是内联形式的: