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)
不够具体,因此需要类型断言。