[muzzik 分享]:如何写好函数参数,避免代码修改次数

# 方式 1

function test(必选参数: number, 可选参数?: TestConfig): void {
    let 参数 = new TestConfig(可选参数);
}

class TestConfig {
    constructor(init_?: TestConfig) {
        Object.assign(this, init_);
    }
    参数a?: number;
    参数b? = "str";
}

# 方式 2

// 类型声明:{ 参数a = null as number, 参数b =  "str" }: 类型
function test(必选参数: number, { 参数a = null as number, 参数b =  "str" }): void {
    let a = 参数a;
}
1赞

参数少的1,多的2。class 改成 interface 写在单独的 .d.ts 里,只做提示用,这样如何?不会参与到编译中,不增加资源大小

没必要混用,第二种才是用 interface 声明类型,而且写成 class 也不会占用多少空间,
两者的区别就是第一种声明和定义可以写在一起,第二种如果加类型声明则需要分开写声明和定义(不写声明没注释),所以我自己一般更喜欢使用第一种,第二种在偷懒的时候用,或者对于有代码洁癖不想定义 class 的人来说可以用第二种

哦,是我理解错误 :rofl:

image
我表达是这两种使用方式的区别。看参数数量来决定使用的方式

test 你怎么定义参数默认值?
test1 你怎么跳过 b 传递 c?

说点不好听的,在我看来这两种方式都是垃圾代码

{)3G%4)V}C)0RSGG)ZW`8D
2G4HEQO}4MDNQT5$TBKSQFA

:japanese_goblin:嗯哼?

test那个可以定义默认值

哦?在函数里面 config.xxx = config.xxx ?? 默认值,这种?如果排除漏写、增加代码量,或者对于某些有可能为null的特殊参数,的确可以这样 :rofl:

也写在参数列表里面

只是单纯想表达需要使用结构体来显示参数时的用法,一般情况下用不到。可以作为一种补充

interface 你怎么写参数列表?给个示例?

(帖子被作者删除,如无标记将在 24 小时后自动删除)

interface IParams {
    a?: number,
    b?: number,
}
function test({ a = 1, b = 2 }: IParams) {

}
function test1(params: IParams = { a: 1, b: 2 }) {

}
这样?

抱歉你说的使用上面回答中 test 函数的方式为什么要用我写的方式呢?那么就只有你回复中的 test1 是符合的,但是 test1 我只传递 a 或者 b 那么另外一个默认值呢?
7H2E_DT)@K7S~)T9Q(8LRC

按我理解,这里面怎么写都可行。唯一区别在于默认参数是否暴露给调用者。用 interface 比较大的问题是调用者只能通过文档或者阅读源码才能知道默认值是多少,不过几年不写代码了,不确定是不是就是了。内部用的话我倾向于用 interface,调用者不应该关注默认值是什么,要关注的话就应该主动填充初始值。

方式 1 相比 interface 最大的问题是内部会多 new 一个对象…… 如果频繁调用会增加 GC 的压力。另外一个问题是会增加代码量。

方式2类型声明代码量 > class 代码量 > 方式2没有类型声明代码量,你说的很对,在频繁调用的接口不应该频繁new,这个看自己使用方式

interface 不占代码量,特别是 import 时可以用 import type,也不容易导致循环依赖

我以为你说的是编译前的,编译后代码量的确比方式2大,但是100个这样的参数 class 混淆后应该也不会到 10 kb 吧,所以我才说代码洁癖

是啊,看自己权衡了,通常无所谓

这样比方式2麻烦,但比方式1多写个类省事一些吧

function test1(params?: { a?: number, b?: number }) {
    params = Object.assign({ a: 1, b: 2 }, params);
}