如何在打字稿中宣告柯里化求和函式型別?我需要一個sum函式,它可以通過像這樣的柯里化來求和數字
console.log(sum(100, 200)(300)()); // 600
console.log(sum(100, 200)()); // 300
console.log(sum()); // 0
我可以用 javascript 實作,但我不知道如何在 typescript 中宣告型別
const sum = function sum(...allNumbers: any[]):any {
if (allNumbers.length === 0) return 0;
const sumValue = (numbers: number[]) =>
numbers.reduce((sum, num) => (sum = num), 0);
return function memoFunc(...nums: any[]): any {
allNumbers = allNumbers.concat(nums);
if (nums.length === 0) {
return sumValue(allNumbers);
}
return memoFunc;
};
}
console.log(sum(100, 200)(300)()); // 600
console.log(sum(100, 200)()); // 300
console.log(sum()); // 0
這是我的代碼,我不知道如何宣告型別,所以我用any替換。我怎樣才能解除它?
uj5u.com熱心網友回復:
// It's easier to use a `type` as it's recursive
type ChainedAdd = ((...numbers: number[]) => ChainedAdd) & (() => number)
function chainedAdd(base: number): ChainedAdd {
// the below definition is overloading definition of ChainedAdd
function add(): number;
function add(...numbers: number[]): ChainedAdd;
function add(...numbers: number[]) {
if (numbers.length > 0) {
// this is sum reducer, replace with whatever you like
let newBase = numbers.reduce((v, e) => v e, base);
return chainedAdd(newBase);
} else {
return base;
}
}
return add
}
const sum = chainedAdd(0);
console.log(sum(100, 200)(300)()); // 600
console.log(sum(100, 200)()); // 300
console.log(sum()); // 0
uj5u.com熱心網友回復:
一種可能是
function sum(): number;
function sum( ...nums: number[]): typeof sum;
function sum(...allNumbers: any): number | typeof sum{
if (allNumbers.length === 0) return 0;
const sumValue = (numbers: number[]): number => numbers.reduce((sum, num) => (sum = num), 0);
const memoFunc = function(...nums: number[]): number | typeof sum{
allNumbers = allNumbers.concat(nums);
if (nums.length === 0) {
return sumValue(allNumbers);
}
return memoFunc as typeof sum;
};
return memoFunc as typeof sum;
}
//console.log(sum()(300)); // compiler error
//const x: number = sum(200, 100); // compiler error
console.log(sum(100, 200)(300)()); // 600
console.log(sum(100)(200)(300)()); // 600
console.log(sum(100, 200)()); // 300
console.log(sum()); // 0
操場
我看到它與 Dimava 先前的回答在概念上非常接近——我暫時將其保留,因為它與原始版本非常接近——可能對 OP 有用。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/522089.html
標籤:打字稿咖喱
上一篇:如何使打字稿考慮對資料型別的過濾
