当通用功能返回Promise<T>
打字稿时,类型检查失败。我做错什么了吗,在这种情况下有没有办法执行类型检查?
//Generic function
function get<T>(): Promise<T> ...
//Typed instance of function, should fail at compile-time Because T != T[]
const typedGet: <T = SomeClass>() => Promise<T[]> = get;
//Should also fail, because T != IterableIterator<T>
const typedGet2: <T = SomeClass>() => Promise<IterableIterator<T>> = get;
考虑到Typescript类型系统的结构性质,以及在编译时删除类型的事实,我认为这不一定是有缺陷的。
让我们研究第一种情况,为签名重命名type参数,以使情况更清楚。
const typedGet: <O = SomeClass>(n: O) => Promise<O[]> = get;
get
是通用的,并且返回a,Promise<T>
并且Promise<O[]>
由于没有其他约束T
可以被分配给return函数O[]
。Typescript不会尝试匹配函数的各个类型参数,因此O != T
这不是问题。
如果要添加参数,则讨论将有所不同:
declare function get<T>(p: T): Promise<T>
const typedGet: <O = SomeClass>(p: O) => Promise<O[]> = get;
现在,如果我们尝试匹配返回类型,则T
必须为O[]
,但是如果我们匹配参数类型T
必须为O
,则我们将无法对此进行协调,并且会出现错误。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句