当我们动态导入一个没有默认导出的javascript文件时,为什么typescript会推断出一个默认属性

当我们动态导入一个没有默认导出的javascript文件时,为什么typescript会推断出一个默认属性,javascript,reactjs,typescript,es6-promise,es6-modules,Javascript,Reactjs,Typescript,Es6 Promise,Es6 Modules,我正在动态导入导出多个函数的javascript文件(并且没有默认导出) const sayHi=import('./sayHi.js') 我希望sayHi的类型是Promise 但事实确实如此 承诺 为什么会添加默认道具 这是一个代码沙盒 为什么\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu自动添加了默认道具? 合成默认导出 您的tsconfig文件中有一个名为的选项,它允许typescript为没有明确默认值的

我正在动态导入导出多个函数的javascript文件(并且没有默认导出)
const sayHi=import('./sayHi.js')

我希望sayHi的类型是
Promise
但事实确实如此
承诺

为什么会添加默认道具

这是一个代码沙盒

为什么
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
自动添加了默认道具?

合成默认导出 您的
tsconfig
文件中有一个名为的选项,它允许typescript为没有明确默认值的文件创建默认导出。默认对象是一个键控对象,包含来自该文件的所有命名导出。如果此设置为
true
,则所有文件的命名导出旁边都将包含一个名为
default
的导出

键入
makeDefaultExport
您的函数
makeDefaultExport
只使用文件中的一个特定命名导出,因此我们可以对该函数应用更严格的typescipt类型,并获得更具体的返回。我们使用第二个通用的
K
作为键,而不仅仅是
keyof T

export const makeDefaultExport = <T, K extends keyof T>(
  promise: Promise<T>, key: K
) => {

@尼古拉斯托尔对我的错误表示歉意。我已经纠正了链接,现在显示类型错误。您可以将鼠标悬停在第6行的红色曲线上,您可以记录promise结果以查看它在运行时的实际外观吗?我想“default”属性的存在是为了确保在覆盖
模块时的互操作性。exports
而不是在其上设置属性。@jonaswillms谢谢。我确实记录了它,但没有默认的道具。请随便看看这个叉子,我在哪里做的。这是一个javascript问题,尽管它可能与tsconfig中的
allowSyntheticDefaultImports
有关:谢谢你的回答。不幸的是,这不起作用,因为K仍然可能是默认值,正在联合中使用默认值推断类型。我们需要删除默认值。这是沙箱。你能链接解释babel做什么(以及如何禁用它)的babel文档吗?当没有默认导出时,似乎应该使用命名导入(或命名空间对象导入)。@Bergi如果在
tsconfig
中设置
allowSyntheticDefaults:false
,则必须导入命名导出或将自己的“默认”设置为
import*作为“React from”React
。以下是TS文档:老实说,我不确定是什么控制了事情的巴别塔方面。大概
Promise<{ default: T[K]; }>
export const makeDefaultExport = <T>(
  promise: Promise<T>, key: Exclude<keyof T, "default">
) => {