[英]How to pass default for named parameters in javascript
我在 typescript 中有一个使用命名参数的方法,如下所示
public foo({x, y, z , m , n} : {x:string, y: number, z: number, m?:string, n?:number}) {
}
参数m
和n
将从另一个 object 提供,例如
const default = { m : 'M', n :10, o:6 }
现在我想像下面这样调用 foo 并且我希望添加默认参数而不在调用中显式传递它们
foo({x:'x', y: 5, z: 0})
所以我的问题是如何在foo
的主体中应用default
,或者在调用之前以某种方式拦截foo
并应用default
public foo({x, y, z , m , n} = {x:string, y: number, z: number, m?:string, n?:number}) {
// for example how to apply default here
}
请注意,为简单起见,我减少了参数数量
我也知道以下这些解决方案我正在寻找样板代码更少的东西
public foo({x, y, z , m , n} = {x:string, y: number, z: number, m?:string, n?:number}) {
if (!m) {
m = default.m;
}
if (!n) {
n = default.n;
}
}
或者
foo({...default, x:'x', y: 5, z: 0 });
对于合并,您需要使用de-structure
进行合并。 default
分配在这里不起作用。 仅当 object 在传递值时未定义时,默认分配才有效。 因此,您需要将默认值与传递的值合并。
请检查代码中的注释。
interface Foo {
x: string;
y: number;
z: number;
m?: string;
n?: number;
o?: number;
}
const defaultValue = { m: "M", n: 10, o: 6 } as Foo;
class A {
public foo(props: Foo) {
const { x, y, z, m, n } = { ...defaultValue, ...props };
console.log(x, y, z, m, n);
}
public foo2({ x, y, z, m = defaultValue.m, n = defaultValue.n }: Foo) {
// this will work, but verbose
console.log(x, y, z, m, n);
}
public foo1({ x, y, z, m, n }: Foo = defaultValue) {
// this will work only if foo1 called without argument
console.log(x, y, z, m, n);
}
public print() {
this.foo({ x: "x", y: 5, z: 0 }); // x 5 0 M 10
this.foo1(); // undefined undefined undefined 'M' 10
this.foo1({ x: "x", y: 5, z: 0 }); // x 5 0 undefined undefined
this.foo2({ x: "x", y: 5, z: 0 }); // x 5 0 M 10
}
}
const a = new A();
a.print();
foo
和foo2
function 将工作。 但是,如果 arguments 的数量过多,则 foo2 会非常冗长。 使用Object.assign()
或{...}
合并值。
在 function 中组合和破坏 object 怎么样?
type someType = {x:string, y: number, z: number, m?:string, n?:number};
const initialValues = { m : 'M', n :10, o:6 }
function foo(obj: someType) {
const {x, y, z , m , n} = {
...initialValues,
...obj
}
}
您可以在参数本身中添加一个默认值,如下所示:
public foo({x, y, z , m = 'a' , n = 10} = {x:string, y: number, z: number, m?:string, n?:number}) {
}
如果您传递一个值,默认值将被覆盖。 通过这种方式,您甚至不需要if
来检查值的存在。
您仍然可以将该方法称为:
foo({...default, x:'x', y: 5, z: 0 });
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.