Typescript 确定TS 2.4中动态模块的类型

Typescript 确定TS 2.4中动态模块的类型,typescript,Typescript,我非常享受TS 2.4中新的动态模块支持,尽管我遇到了以下小问题: 使用import()时,将给出模块的类型(…)。如果需要存储promise以备以后使用,则无法为promise生成一个类型参数来传递模块类型信息。 我正在尝试在包装器react组件中进行动态加载(我应该在这里使用react router v4),我希望在构造函数中开始加载,并在组件首次装入时重新加载。这有一个“闪烁”的问题,但除此之外,它还能工作: import * as React from 'react' export c

我非常享受TS 2.4中新的动态模块支持,尽管我遇到了以下小问题:

使用import()时,将给出模块的类型(…)。如果需要存储promise以备以后使用,则无法为promise生成一个类型参数来传递模块类型信息。

我正在尝试在包装器react组件中进行动态加载(我应该在这里使用react router v4),我希望在构造函数中开始加载,并在组件首次装入时重新加载。这有一个“闪烁”的问题,但除此之外,它还能工作:

import * as React from 'react'

export class DashboardDynamic extends React.Component<any, any> {
    constructor(props) {
        super(props)

        // At this point typescript knows the type of the import, including the "Dashboard" export
        this.loaderPromise = import(/* webpackChunkName: "dashboard" */ './Dashboard')
    }

    componentDidMount() {
        // Promise<any> makes the {Dashboard} component an "any" type
        this.loaderPromise.then(({Dashboard}) => {
            this.myContent = <Dashboard {...this.props}/>
            this.forceUpdate()
        })
    }

    myContent: JSX.Element = <div />;
    loaderPromise: Promise<any> = null // PROBLEM: "any", not module type.

    render() {
        return this.myContent
    }
}
import*作为来自“React”的React
导出类Dashboard动态扩展React.Component{
建造师(道具){
超级(道具)
//此时typescript知道导入的类型,包括“Dashboard”导出
this.loaderPromise=import(/*webpackChunkName:“dashboard”*/'./dashboard')
}
componentDidMount(){
//Promise使{Dashboard}组件成为“任意”类型
this.loaderPromise.then({Dashboard})=>{
此.myContent=
这个.forceUpdate()文件
})
}
myContent:JSX.Element=;
loaderPromise:Promise=null//问题:“任意”,而不是模块类型。
render(){
把这个还给我
}
}

任何知道如何键入promise以使其保存正确类型的动态模块的人?

虽然我认为目前不可能使用类似导入类型('./Dashboard')的东西,您可以创建一个更高阶的组件,在保留导入中的类型的同时,将
componentDidMount
中的内容分解出来

将按如下方式键入:

function dynamicComponent<Props>(loader: () => Promise<React.ComponentType<Props>>): React.ComponentType<Props>
const DynamicDashboard = dynamicComponent(() => import('./Dashboard').then(({ Dashboard }) => Dashboard)))

我想出了一个办法,虽然很难看:

通过将负载分离为函数,我们可以使用该方法获得类型。然后我们得到:

const loadDashboard=()=>import(/*webpackChunkName:“dashboard”*/'./dashboard')
const loadTypeDummy=(假为真)和&loadDashboard()
IDashboardModule类型=loadTypeDummy的类型
IDashboardModule是一种承诺类型,可用于键入成员变量

更新:
使用TS 2.8您只需执行
ReturnType
即可,无需进行伪函数调用。查看
ReturnType
的定义,它太棒了。

这对我来说是个不错的选择。当我有机会测试它的时候,我会发回来的。有了TS 2.8,就可以进行打字了。请看下面我的答案。你能发一个链接吗?我的所有动态导入都没有类型。没有智能感知的生活很糟糕:(@Nickdb93什么样的链接?有了TS 2.8,这应该很容易,但我没有一个公共项目给你看。顺便说一句:我不羡慕你现在的处境。。。