将javascript链接setter转换为typescript
我一直在javascript中使用这个习惯用法来创建链式setter将javascript链接setter转换为typescript,javascript,typescript,idioms,Javascript,Typescript,Idioms,我一直在javascript中使用这个习惯用法来创建链式setter function bar() { let p = 0; function f() { } f.prop = function(d) { return !arguments.length ? p : (p = d, f); } return f; } 这使我可以轻松创建和设置为const b=bar().prop(2),将b作为函数,并允许附加更多的链式
function bar() {
let p = 0;
function f() {
}
f.prop = function(d) {
return !arguments.length ? p : (p = d, f);
}
return f;
}
这使我可以轻松创建和设置为const b=bar().prop(2)
,将b
作为函数,并允许附加更多的链式语句。它通过使用b.prop()
来获取属性,当然不能进一步链接
我试图将其转换为TypeScript,并找到了这个解决方案,虽然它正确地允许键入,但它似乎不太清楚
p.prop = (...args: [number?]) => !args.length ? p : (p = args[0]!, f);
当参数有多种类型时,这一点变得更加模糊
p.prop = (...args: [(number | boolean)?]) => !args.length ? p : (p = args[0]!, f);
是否有任何惯用的typescript方法来进行此设置和获取?因为
prop
函数只接受一个可能的参数,您只需将d
声明为可选,然后检查它是否存在,就可以使typescript版本更类似于Javascript(并且更简单)。不需要rest语法或数组:
f.prop = function(d?: number) {
return d === undefined ? p : (p = d, f);
}
对于其他类型,只需将该类型添加到d
参数中,因为它将被分配到p
,所以也要声明p
的类型:
function bar() {
let p: number | boolean = 0;
function f() {
}
f.prop = function (d?: number | boolean) {
return d === undefined ? p : (p = d, f);
}
return f;
}
const b = bar().prop(2)
由于
prop
函数只接受一个可能的参数,因此只需将d
声明为可选,然后检查它是否存在,就可以使Typescript版本更类似于Javascript(并且更简单)。不需要rest语法或数组:
f.prop = function(d?: number) {
return d === undefined ? p : (p = d, f);
}
对于其他类型,只需将该类型添加到d
参数中,因为它将被分配到p
,所以也要声明p
的类型:
function bar() {
let p: number | boolean = 0;
function f() {
}
f.prop = function (d?: number | boolean) {
return d === undefined ? p : (p = d, f);
}
return f;
}
const b = bar().prop(2)
您可以声明类似于:
}您可以声明一个类似:
}为什么
f
是一个函数而不是一个对象呢?@Aplet123是我从很久以前就开始使用的一种模式。我还没有弄清楚如何用类来实现它。有什么原因使f
是一个函数而不是一个对象吗?@Aplet123是我从很久以前就开始使用的一种模式。我还没有弄明白如何用类实现它。我没有想到要检查是否有未定义的。这太棒了!我没有想到要检查未定义的。这太棒了!