指定一个带有默认值的 'options' objcet 的函数

Specifying a function which takes an 'options' objcet with default values

我想实现一个函数,该函数接受具有默认值的 options 对象。

我知道该怎么做,但我想强制要求用户未指定的任何字段都将获得函数头中指定的默认值。

这是我目前的情况:

function func(options: {x: number; y: string;} = {x: 1, y: "1"}) {
    const x: number = options.x != undefined ? options.x : 1;
    const y: string = options.y != undefined ? options.y : "1";
    console.log(x, y);
}

当我在输出 Javascript 文件上测试这个函数时,这工作正常:

func();
func({});
func({x: 0});
func({y: "2"});
func({x: 3, y: "4"});

结果为:

1 '1'
1 '1'
0 '1'
1 '2'
3 '4'

但是,感觉有点老套(特别是,我需要在两个不同的地方指定每个默认值)。

Typescript 中是否有已知的设计模式?

const defaults = {
   x: 1, 
   y: "1"
}

function func(options = defaults) {
    const x: number = options.x != undefined ? options.x : 1;
    const y: string = options.y != undefined ? options.y : "1";
    console.log(x, y);
}

这将完成您想要的。

更紧凑:

function func(options = { x: 1, y: "1" }) {
    const x: number = options.x != undefined ? options.x : 1;
    const y: string = options.y != undefined ? options.y : "1";
    console.log(x, y);
}

最紧凑的:

function func({x,y} = { x: 1, y: "1" }) {
   const _x = x ? x : 1;
   const _y = y ? y : "1";
   console.log(_x, _y);
}

TypeScript 根据提供的默认值推断类型。

两个地方不需要有默认值,可以这样缩短:

function func({ x = 1, y = "1" }: { x?: number; y?: string; } = {}) {
    console.log(x, y);
}

func();
func({});
func({ x: 0 });
func({ y: "2" });
func({ x: 3, y: "4" });

或者更短,如果您不需要显式类型:

function func({ x = 1, y = "1" } = {}) {
    console.log(x, y);
}

结果:

1 '1'
1 '1'
0 '1'
1 '2'
3 '4'