如何修复错误 TS1015:参数不能有问号和初始值设定项?

问题描述 投票:0回答:2

我刚刚升级到 TypeScript beta 0.9,现在收到错误:

TS1015:参数不能有问号和初始化器

这之前是有效的,我该如何解决这个问题?

这是生成此错误的代码示例:

functionName(parameterName?: typeName = defaultValue): typeName
typescript
2个回答
109
投票

如果您查看 TypeScript 语言规范 文档,您可以找到有关语言语法的大量详细信息。

3.9.2 节描述了调用签名,即用于调用函数和构造函数等的语法。

3.9.2.2 节专门介绍与调用相关的参数。

它将可选参数定义为:

AccessibilityModifieropt BindingIdentifierOrPattern ?类型注释opt

AccessibilityModifieropt BindingIdentifierOrPattern TypeAnnotationopt 初始化器

我们可以看到,要么使用“?” OR 提供默认值 Initializer 会将参数标记为可选。

因此,要修复编译器错误,您只需删除“?”即可并保留默认值,它将按照您的意愿保留为可选参数。


0
投票

除了user310988

answer
之外,在TypeScript v5.2.5中,条件在
checker.ts

/** @internal */
export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
// ...
    function checkGrammarParameterList(parameters: NodeArray<ParameterDeclaration>) {
        let seenOptionalParameter = false;
        const parameterCount = parameters.length;

        for (let i = 0; i < parameterCount; i++) {
            const parameter = parameters[i];
            if (parameter.dotDotDotToken) {
                // ...
            }
            else if (hasEffectiveQuestionToken(parameter)) {
                seenOptionalParameter = true;
                if (parameter.questionToken && parameter.initializer) {
                    return grammarErrorOnNode(parameter.name, Diagnostics.Parameter_cannot_have_question_mark_and_initializer);
                }
            }
            else // ...
        }
    }

对象

Diagnostics.Parameter_cannot_have_question_mark_and_initializer
具有以下属性:

{
  code: 1015,
  category: 1 /* Error */,
  key: "Parameter cannot have question mark and initializer."
}

来自文件

diagnosticMessages.json
的对象通过命令
Diagnostics
生成为实现接口
hereby generate-diagnostics
的正确对象。


以防万一,关于

checker.ts
的尺寸,请检查以下内容:

- 有人可以解释性能问题吗?在我看来,你无法因此分割 41k 行文件,这似乎很疯狂。
- 想象一下你有这样的代码结构......在现代 JS 引擎中,像

y1
y2
这样的裸名查找比像
obj.y1
obj.y2
这样的属性访问要快得多,这是一个事实。那么,挑战是:如何以保持性能改进的方式“拆分”
fn

来源

© www.soinside.com 2019 - 2024. All rights reserved.