我刚刚升级到 TypeScript beta 0.9,现在收到错误:
TS1015:参数不能有问号和初始化器
这之前是有效的,我该如何解决这个问题?
这是生成此错误的代码示例:
functionName(parameterName?: typeName = defaultValue): typeName
如果您查看 TypeScript 语言规范 文档,您可以找到有关语言语法的大量详细信息。
第 3.9.2 节描述了调用签名,即用于调用函数和构造函数等的语法。
第 3.9.2.2 节专门介绍与调用相关的参数。
它将可选参数定义为:
AccessibilityModifieropt BindingIdentifierOrPattern ?类型注释opt
AccessibilityModifieropt BindingIdentifierOrPattern TypeAnnotationopt 初始化器
我们可以看到,要么使用“?” OR 提供默认值 Initializer 会将参数标记为可选。
因此,要修复编译器错误,您只需删除“?”即可并保留默认值,它将按照您的意愿保留为可选参数。
除了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
来源