Typescript - 返回Promise的泛型函数的错误类型检查

时间:2018-03-14 12:02:31

标签: typescript

当泛型函数返回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;

1 个答案:

答案 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,那么我们无法协调此,我们收到错误。