javascript - 当我们动态导入没有默认导出的javascript文件时,为什么打字稿会推断出默认道具
问题描述
我正在动态导入一个导出多个函数的 javascript 文件(并且没有默认导出)
const sayHi = import('./sayHi.js')
我期待sayHi的类型是,Promise<{name1: function, name2: function}>
但它是
Promise<{default: typeof import('./sayHi.js'), name1: function, name2: function}>
为什么要添加默认道具
这是一个代码框 https://codesandbox.io/s/typescript-dynamic-import-w4nb1?file=/src/index.tsx
解决方案
合成默认导出
tsconfig
您的文件中有一个名为的选项,allowSyntheticDefaults
它允许 typescript 支持 Babel 为没有显式默认值的文件创建默认导出。默认对象是包含该文件中所有命名导出的键控对象。如果此设置是,true
那么所有文件都将default
在其命名导出旁边包含一个名为 include 的导出。
打字makeDefaultExport
您的函数makeDefaultExport
仅使用文件中的一个特定命名导出,因此我们可以对该函数应用更严格的 typecipt 类型并获得更具体的返回。我们不只是keyof T
使用 ,而是使用第二个泛型K
作为键。
export const makeDefaultExport = <T, K extends keyof T>(
promise: Promise<T>, key: K
) => {
现在此函数将仅返回特定命名导出的类型,而不是所有导出的并集(包括默认值)。返回类型为:
Promise<{ default: T[K]; }>
编辑:我推荐上述方法,因为它可以正确处理并非所有命名导出都具有相同类型的文件。在您的特定情况下,所有导出都是相同类型,因此我们不会通过返回除default
.
export const makeDefaultExport = <T>(
promise: Promise<T>, key: Exclude<keyof T, "default">
) => {
推荐阅读
- java - 从 IntelliJ Java 自动化 C++ 调试
- sql-server - WITH UTF-8 排序规则数据库中 CHAR 和 NCHAR 的区别
- android - 找到一个任务完成的动画库以在 Android Studio 中使用
- python - 如果缺少日期,熊猫将日期时间设置为每月的第一天?
- mysql - mysql jdbc连接失败isValid
- php - RewriteRule 不适用于给定的参数
- javascript - 如何更改导航栏当前页面的颜色
- android - 使用 LeakCanary 解决 Dialog Fragment 内存泄漏
- javascript - Handlebars JS:如何在页面上显示 URL 参数值
- html - 我是否正确使用 X-Content-Security-Policy?