理解Typescript中的复杂类型声明

理解Typescript中的复杂类型声明,typescript,types,visual-studio-code,typescript2.0,typescript2.3,Typescript,Types,Visual Studio Code,Typescript2.0,Typescript2.3,查看此类型声明的示例: export interface Thenable<R> { then<U>(onFulfilled?: (value: R) => U | Thenable<U>, onRejected?: (error: any) => U | Thenable<U>): Thenable<U> then<U>(onFulfilled?: (value: R) => U | Th

查看此类型声明的示例:

export interface Thenable<R> {
    then<U>(onFulfilled?: (value: R) => U | Thenable<U>, onRejected?: (error: any) => U | Thenable<U>): Thenable<U>
    then<U>(onFulfilled?: (value: R) => U | Thenable<U>, onRejected?: (error: any) => void): Thenable<U>
    catch<U>(onRejected?: (error: any) => U | Thenable<U>): Thenable<U>
}
在这种情况下,
val1
是一种可能性/承诺

const val2 = await announce(..)
val2
的类型为
messagesAndResponse

我的问题是,我不理解以下关于
Thenable
接口的内容:

  • Thenable
    是什么意思?我知道
    U
    是一种泛型,但是
    Thenable
    是什么意思?还有什么写的方法

  • 不知何故,这个定义是说函数返回一个thenable/promise,而该函数又返回一个泛型。但是
    then
    catch
    的接口类型和返回值都属于
    Thenable
    类型。它看起来像是在说它返回自己,我认为这是正确的,因为一个thenable可以返回另一个thenable,但是如果它说它返回
    thenable
    ,它怎么知道它知道解析是
    MessagesSemdResponse
    ?IDE中是否有用于此的内置功能

  • 我意识到问题2反映了我的困惑。任何指向引用的链接都很受欢迎,我找不到与此模式类似的任何链接。

    表格
    表示您有一个对象,可以从中获取类型为
    t
    的值
    或者,如果将其命名为
    Promise
    ,则会得到一个类型为
    T
    的值

    由于承诺通常用于异步操作,因此承诺不会“返回值”,而是提供一个api,用于在该值可用时获取该值的引用

    then
    /
    catch
    返回
    Thenable
    的原因是您可以链接调用:

    announce(...).then(value => {
        ...
    }).catch(error => {
        ...
    });
    
    当值可用或出现问题时,将调用传递给
    然后
    /
    catch
    的函数

    then
    /
    catch
    返回的承诺与调用函数的承诺不同,它是一个新实例,编译器根据传递的函数的返回值推断此新承诺的泛型类型,例如:

    const fn = (): Promise<string> => {
        return Promise.resolve("43"); 
    }
    
    fn().then(str => Number(str)).then(num => console.log(num))
    
    已履行
    一种函数,它需要一个
    R
    类型的值,并将
    U
    类型的值或
    表格
    返回到
    U

    被拒绝
    一种函数,它需要一个
    any
    类型的值,并将
    U
    类型的值或
    Thenable
    返回到
    U

    返回
    类型为
    U
    的值的
    Thenable
    实例,是执行
    oncompleted
    onRejected
    的结果,表示您有一个对象,可以从中获取类型为
    T

    或者,如果将其命名为
    Promise
    ,则会得到一个类型为
    T
    的值

    由于承诺通常用于异步操作,因此承诺不会“返回值”,而是提供一个api,用于在该值可用时获取该值的引用

    then
    /
    catch
    返回
    Thenable
    的原因是您可以链接调用:

    announce(...).then(value => {
        ...
    }).catch(error => {
        ...
    });
    
    当值可用或出现问题时,将调用传递给
    然后
    /
    catch
    的函数

    then
    /
    catch
    返回的承诺与调用函数的承诺不同,它是一个新实例,编译器根据传递的函数的返回值推断此新承诺的泛型类型,例如:

    const fn = (): Promise<string> => {
        return Promise.resolve("43"); 
    }
    
    fn().then(str => Number(str)).then(num => console.log(num))
    
    已履行
    一种函数,它需要一个
    R
    类型的值,并将
    U
    类型的值或
    表格
    返回到
    U

    被拒绝
    一种函数,它需要一个
    any
    类型的值,并将
    U
    类型的值或
    Thenable
    返回到
    U

    返回
    类型为
    U
    的值的
    表格的一个实例,它是执行
    onCompleted
    onRejected
    第1部分的结果:

    export interface Thenable<R> {
    
    它有方法
    then
    ,该方法采用两个参数
    oncompleted
    onRejected
    ,该方法本身是通用的-它依赖于另一种类型的参数
    U

    第三部分,最有趣的一个:

    oncompleted
    使用以下类型声明:

    (value: R) => U | Thenable<U>
    
    (值:R)=>U |表格
    
    这意味着它要么是一个接受
    R
    并返回
    U
    的函数,要么是另一个
    表格

    这里是
    R
    U
    之间的关系:如果您有
    Thenable
    ,则它是
    ,然后
    方法接受一个回调,该回调使用
    R
    类型的值(原始Thenable生成的值)调用,并且应该返回
    U
    。或者它可以接受另一个
    表格

    这个
    then
    方法的返回值是
    Thenable

    简言之,这就是如何用类型描述承诺链。

    第1部分:

    export interface Thenable<R> {
    
    它有方法
    then
    ,该方法采用两个参数
    oncompleted
    onRejected
    ,该方法本身是通用的-它依赖于另一种类型的参数
    U

    第三部分,最有趣的一个:

    oncompleted
    使用以下类型声明:

    (value: R) => U | Thenable<U>
    
    (值:R)=>U |表格
    
    这意味着它要么是一个接受
    R
    并返回
    U
    的函数,要么是另一个
    表格

    这里是
    R
    U
    之间的关系:如果您有
    Thenable
    ,它是
    ,那么
    方法接受一个c