typescript有如下代码:
const func = (a?: {x: number, y: number}, b?: {x: number, y: number}) => {
//
}
func({x: 1, y: 2})
请问一下,我们在调用的时候,如第二行,直接传{x:1, y:2}
请问一下,这里不能这样传输:
func(a: {x: 1, y: 2})
那么在执行代码的时候,如何进行确定是a还是b呢?
typescript有如下代码:
const func = (a?: {x: number, y: number}, b?: {x: number, y: number}) => {
//
}
func({x: 1, y: 2})
请问一下,我们在调用的时候,如第二行,直接传{x:1, y:2}
请问一下,这里不能这样传输:
func(a: {x: 1, y: 2})
那么在执行代码的时候,如何进行确定是a还是b呢?
typescript
中调用方法时,只能按照顺序将实参和形参对应;typescript
不支持 func(a: {x: 1, y: 2})
这样的语法(Dart
支持),如果想实现任意顺序传参,可以选择将方法的形参改造为一个对象,示例如下:interface Params {
a?: SomeObject;
b?: SomeObject;
}
function func(params: Params = {}) {
console.log(params.a, params.b);
}
// 或者直接解构params
function func({ a, b }: Params = {}) {
console.log(a, b);
}
func({b: {}});
8 回答4.8k 阅读✓ 已解决
6 回答3.5k 阅读✓ 已解决
6 回答2.4k 阅读
5 回答6.4k 阅读✓ 已解决
3 回答2.5k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
3 回答2.6k 阅读✓ 已解决
这跟 TS 有什么关系?TS 就是个类型标记,代码执行的时候只剩下 JS。
去掉类型,就只是:
实参跟形参是一一对应的,传入的第一个参数 arg1 就对应
a
,传入的第二个参数 arg2 就对应b
,这又不可能串位置。即便第一个参数是个可选参数,你想跳过第一个、直接指定第二个参数,那你也得传个 undefined 进去才行:
如果你想要的是更彻底一点儿的,形参顺序跟实参顺序不用严格对照,可以直接:
这样给第二个参数
b
传值。那很遗憾,JS/TS 没这样的语法特性。其他语言中倒是有类似的特性,比如 C# 中的命名参数(Named Arguments),Ruby 中的关键字参数(Keyword Arguments)等等。