将 javascript 链接 setter 转换为打字稿
Converting javascript chained setter to typescript
我一直在 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);
是否有任何惯用的打字稿方式来进行此设置和获取?
因为 prop
函数只接受一个可能的参数,您可以通过简单地将 d
声明为可选来使 Typescript 版本更类似于 Javascript (并且更简单),然后检查它是否存在。不需要休息语法或数组:
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)
您可以声明一个 function interface 如:
interface Chainable {
(): void;
prop: (d: any) => Chainable
};
function bar(): Chainable {
...
const fChainable = f;
return fChainable;
}
我一直在 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);
是否有任何惯用的打字稿方式来进行此设置和获取?
因为 prop
函数只接受一个可能的参数,您可以通过简单地将 d
声明为可选来使 Typescript 版本更类似于 Javascript (并且更简单),然后检查它是否存在。不需要休息语法或数组:
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)
您可以声明一个 function interface 如:
interface Chainable {
(): void;
prop: (d: any) => Chainable
};
function bar(): Chainable {
...
const fChainable = f;
return fChainable;
}