当泛型函数返回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;
答案 0 :(得分:1)
鉴于Typescript类型系统的结构性质,以及类型在编译时被删除的事实,我认为它不一定是错误的。
让我们检查第一种情况,重命名签名的类型参数,以使事情更加清晰。
const typedGet: <O = SomeClass>(n: O) => Promise<O[]> = get;
get
是通用的,返回Promise<T>
并被分配给返回Promise<O[]>
的函数,因为没有其他约束T
可以是{{1} }}。 Typescript不会尝试匹配函数的各个类型参数,因此O[]
不是问题。
如果我们要添加参数,讨论会有所不同:
O != T
现在,如果我们尝试匹配返回类型,declare function get<T>(p: T): Promise<T>
const typedGet: <O = SomeClass>(p: O) => Promise<O[]> = get;
必须为T
,但如果我们匹配参数类型O[]
必须为T
,那么我们无法协调此,我们收到错误。