Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/415.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将javascript链接setter转换为typescript_Javascript_Typescript_Idioms - Fatal编程技术网

将javascript链接setter转换为typescript

将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作为函数,并允许附加更多的链式

我一直在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
作为函数,并允许附加更多的链式语句。它通过使用
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是我从很久以前就开始使用的一种模式。我还没有弄明白如何用类实现它。我没有想到要检查是否有未定义的。这太棒了!我没有想到要检查未定义的。这太棒了!