Typescript 传入函数或值并始终返回值

Typescript 传入函数或值并始终返回值,typescript,Typescript,我试图创建一个函数,该函数将接受另一个函数,当调用该函数时,它将解析为特定类型的值,或者如果传递了该值,则只返回该值 然而,我不能在最后把它缩小到一个值 type Test<T> = (() => T) | T class List{ constructor(protected fnOrNumber: Test<number>) { //fnOrNumber will sometimes be number or function that

我试图创建一个函数,该函数将接受另一个函数,当调用该函数时,它将解析为特定类型的值,或者如果传递了该值,则只返回该值

然而,我不能在最后把它缩小到一个值

type Test<T> = (() => T) | T

class List{
    constructor(protected fnOrNumber: Test<number>) {
        //fnOrNumber will sometimes be number or function that returns number
    }

    get list(): number{
        return resolve(this.fnOrNumber)
        // ^^^
        //Type 'Test<number>' is not assignable to type 'number'.
        //Type '() => number' is not assignable to type 'number'.
    }

}

//function to resolve the final value
function resolve<T>(v: T): T{
    if (typeof v === 'function') {
        return v() 
    }
    return v
}

型式试验=(()=>T)|T
班级名单{
构造函数(受保护FNORNAMBER:测试){
//fnOrNumber有时是数字或返回数字的函数
}
获取列表():编号{
返回解析(this.fnOrNumber)
// ^^^
//类型“Test”不可分配给类型“number”。
//类型“()=>number”不能分配给类型“number”。
}
}
//函数来解析最终值
函数解析(v:T):T{
如果(v的类型==='函数'){
返回v()
}
返回v
}

无论您的
resolve
函数的实现如何,签名
resolve(v:T):T
声明返回传递给它的任何类型;i、 它说如果你给它传递一个函数,那么它会根据它的声明返回一个函数

由于您已经声明了一个类型
Test=(()=>T)| T
,我们可以将
resolve
函数更改为:

函数解析(v:Test):T{
如果(v的类型==='函数'){
返回值(v as()=>T)()
}
返回v
}

我们需要类型断言,因为
typeof v===='function'
并不局限于
v:()=>t

我已经将
Test
类型编写为它返回的内容(函数->值,或仅仅是值)的文本表示形式,您是否会以不同的方式编写它?为什么
typeof
line不能缩小类型?当我使用原语值或任何其他可以与
typeof
一起使用的值时,
Test
类型是您的输入,而不是您的输出;您说过输出应该始终是一个数字(即普通类型
T
),因此在这种情况下,输出不应该是一个函数
typeof
确实缩小了类型范围,只是没有缩小到
v:()=>T
。它把范围缩小到
v:(T&Function)|(()=>T)
。类型
(T&Function)
不够具体,因此需要类型断言。