TypeScript 在params中,非空对象没有被解析的属性,

c8ib6hqw  于 4个月前  发布在  TypeScript
关注(0)|答案(7)|浏览(62)

TypeScript版本: 3.5.2
搜索词: object param
代码:

/**
* Converts a type to a markdown string.
* @param {!Object} [opts]
* @param {boolean} [opts.narrow] Combine type and description.
*/

预期行为:

实际行为:

Playground链接:
相关问题:

y1aodyip

y1aodyip1#

解析器仅支持以下用于嵌套类型构建的标记:object, Object, object[], Object[] ——由于容易出错,不支持包含 Object 作为标记的任何类型。jsdoc或closure的文档中也没有提到支持!Object,尽管有可能closure确实支持它。

a9wyjsp7

a9wyjsp72#

@sandersn i know the parser doesn't support it that's why the issue is there. what do you mean error-prone? you can't add ! lookup in the parser? !Object is just same as Object which cannot be null. if anything, your parser is incorrect NOW because null is not destructurable. why close issue.

bcs8qyzn

bcs8qyzn3#

  1. Object 在这个结构中是一个语法标记,而不是一个真正的类型。
  2. 据我所知,没有其他系统支持这个结构中的 !Object - 请指出支持它的系统。
  3. 我希望 Typescript 不是唯一支持这个结构的系统,因为我不希望鼓励使用这个结构编写新的代码。它只用于理解为闭包或 jsdoc 生成而编写的现有代码。
    新代码应该使用多个类型定义、Typescript 自己的对象字面量类型,或者只是在单独的 d.ts 文件中声明类型。
ahy6op9u

ahy6op9u4#

感谢你的回复,伙计。我理解这个帖子是在typescript仓库中,但它不是关于typescript的,而是关于vscode的。像这样的问题都在这里移动。

我没有描述清楚,是的,闭包确实支持它。唯一的问题出在这里,因为我不能正确地使用闭包。你可以在闭包中有一个原始对象,比如{ abc: string },或者你可以有一个记录。记录是可空的,而原始类型不是。因此,当我将记录作为参数传递时,我必须用!标记它们为非空,因为否则编译器会给我一个警告。看这里https://github.com/google/closure-compiler/wiki/Types-in-the-Closure-Type-System

非空类型

fafcakar

fafcakar5#

这是在VSCode中使用JS的正确地方,因为TS也可以处理这些。我在Closure Compiler Service上尝试了一个示例程序,它给了我这个警告:

JSC_INVALID_PARAM: Parse error. invalid param name "name.narrow" at line 3 character 20
 * @param {boolean} [name.narrow]

如果我将实际属性更改为其他内容,例如now,但保留JSDoc为narrow,错误不会改变。这表明闭包忽略了JSDoc。我做错了什么吗?这个版本的闭包不支持嵌套对象类型吗?我粘贴了完整的程序以防链接不起作用。

// ==ClosureCompiler==
// @compilation_level ADVANCED_OPTIMIZATIONS
// @output_file_name default.js
// ==/ClosureCompiler==

/**
* @param {!Object} [name]
* @param {boolean} [name.narrow]
*/
function hello(name) {
  if (name)
    alert(name.narrow);
}
hello({ narrow: true });
yhived7q

yhived7q6#

是的,我不知道他们正在运行哪个版本的gcc应用程序,但当前的独立(google-closure-compiler-java)JAR上没有警告。

ttp71kqs

ttp71kqs7#

在处理 #52370 时,我遇到了类似的问题。我发现的问题是,如果没有类型注解,在使用 @param 注解中的解构功能将不起作用:

/**
* 
* @param {Object} param0 description
* @param {*} [param0.a=1] some desc
*/
function foo({ a = 1 }) { } // This works, we understand "some desc" is a description for `a`

/**
* 
* @param param0 description
* @param [param0.a=1] some desc
*/
function bar({ a = 1 }) { } // This doesn't work, we don't understand "some desc" is a description for `a`

与Nathan一起查看解析器代码后,这似乎是因为我们只尝试推测性地解析以下 @param (或 @property) JSDoc标签作为子标签,前提是当前标签具有 ObjectObject[](以及 object 变体)的类型表达式。因此,为了使这种解构注解正常工作,您不能省略类型注解,这可能是您想要做的事情,如果您正在为TypeScript编写注解,因为那时类型注解将无关紧要,而且linter可能会抱怨它们。这与最初报告的问题类似,但在那里问题是类型表达式不匹配 ObjectObject[]

相关问题