如何完全键入此阶乘函数?

时间:2018-10-22 19:56:24

标签: typescript functional-programming

const fact: (n: number) => number = ((f: any) => f(f))((g: any) => (n : number) => n > 0 ? n * g(g)(n - 1) : 1);

昨天我开始玩Typescript,但尝试后却心碎。 n显然是数字,但是f和g呢?

1 个答案:

答案 0 :(得分:1)

您可以声明一个接受其自身作为参数并返回结果的可调用接口:

interface Rec<T> {
    (p: Rec<T>): T
}

const fact: (n: number) => number = ((f: Rec<(n: number)=> number>) => f(f))((g) => (n : number) => n > 0 ? n * g(g)(n - 1) : 1);

注意:编译器将推断g的类型为Rec<(n: number)=> number>

或更不通用的,让编译器推断其可以版本化的所有内容:

interface Rec {
    (p: Rec): (n: number)=> number
}

const fact = ((f: Rec) => f(f))((g) => (n) => n > 0 ? n * g(g)(n - 1) : 1);