TypeScript报错TS2554: Expected 0-1 arguments, but got 2求解
错误原因分析
1. 核心错误(TS2554)触发原因
你报错的new Map('+', 函数)写法不符合Map构造函数的参数要求:
- Map构造函数仅接受0个或1个参数,唯一可选参数是由键值对数组组成的可迭代对象,格式为
[[key1, value1], [key2, value2], ...] - 你直接传入了2个独立参数(字符串+箭头函数),和预期的参数格式不匹配,所以抛出「期望0-1个参数,实际得到2个」的错误。
2. 隐性问题补充
你代码中还有两处隐藏的逻辑问题需要同步修复:
- 你定义的
Type类没有声明接受两个入参的构造函数,直接写new Type('Integer', new Set())会触发额外的参数不匹配错误 - 判断数值是否为
NaN不能用LeftNumber != NaN的写法,因为NaN和任何值做相等判断都返回false,必须用isNaN()或Number.isNaN()方法判断 - 箭头函数的返回值要求为
Value,但你原来的逻辑只在符合判断条件时有返回,不符合条件时无返回值,不符合类型声明要求
修复方案
步骤1:补全Type类的构造函数定义
export class Type { public name: string; private definedOperations: Set<OperationMap>; // 新增构造函数接收传入参数 constructor(name: string, operations: Set<OperationMap>) { this.name = name; this.definedOperations = operations; } public appendOperation(operationMap: OperationMap) { this.definedOperations.add(operationMap); } }
步骤2:修正Map的初始化写法
有两种符合语法的写法可选:
写法1:构造Map时直接传入键值对数组
const operationMap = new Map<OperationSymbol, (Left: Value, Right: Value) => Value>([ ['+', (Left: Value, Right: Value): Value => { const LeftNumber = Number(Left); const RightNumber = Number(Right); const areIntegers = Number.isInteger(LeftNumber) && Number.isInteger(RightNumber); if (!isNaN(LeftNumber) && !isNaN(RightNumber) && areIntegers) { return new Value((LeftNumber + RightNumber).toString(), Integer); } // 补全兜底逻辑,符合返回值要求 throw new Error('操作数不是合法整数'); }] ]);
写法2:先初始化空Map,再调用set方法添加键值对
const operationMap = new Map<OperationSymbol, (Left: Value, Right: Value) => Value>(); operationMap.set('+', (Left: Value, Right: Value): Value => { const LeftNumber = Number(Left); const RightNumber = Number(Right); const areIntegers = Number.isInteger(LeftNumber) && Number.isInteger(RightNumber); if (!isNaN(LeftNumber) && !isNaN(RightNumber) && areIntegers) { return new Value((LeftNumber + RightNumber).toString(), Integer); } throw new Error('操作数不是合法整数'); });
内容的提问来源于stack exchange,提问作者yagil
相关产品推荐
相关产品推荐

