Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 从pg PROMITE示例中的“pg PROMITE”导入*作为PGPROMITE会导致类型脚本错误TS2349:此表达式不可调用_Typescript_Tsconfig_Pg Promise - Fatal编程技术网

Typescript 从pg PROMITE示例中的“pg PROMITE”导入*作为PGPROMITE会导致类型脚本错误TS2349:此表达式不可调用

Typescript 从pg PROMITE示例中的“pg PROMITE”导入*作为PGPROMITE会导致类型脚本错误TS2349:此表达式不可调用,typescript,tsconfig,pg-promise,Typescript,Tsconfig,Pg Promise,在我的程序中调整推荐的typescript示例 从“pg承诺”导入*作为pg承诺; const pg=pgPromise; 不起作用。第二行导致错误: 此表达式不可调用。类型“typeof pgPromise”没有调用签名。ts2349 谷歌搜索错误消息不会返回与模块导入相关的答案,因为它们都处理调用不可调用的对象。然而,我需要一种不同的解释:我不知道为什么import语句会生成一个非函数对象,尽管作者的意图显然是返回一个函数,该函数将启用具有多个参数的底层模块的初始化 分析模块源代码没有多大帮

在我的程序中调整推荐的typescript示例

从“pg承诺”导入*作为pg承诺; const pg=pgPromise; 不起作用。第二行导致错误:

此表达式不可调用。类型“typeof pgPromise”没有调用签名。ts2349

谷歌搜索错误消息不会返回与模块导入相关的答案,因为它们都处理调用不可调用的对象。然而,我需要一种不同的解释:我不知道为什么import语句会生成一个非函数对象,尽管作者的意图显然是返回一个函数,该函数将启用具有多个参数的底层模块的初始化


分析模块源代码没有多大帮助,它是用javascript编写的,看起来不是很透明。

最后我自己找到了答案

示例中有一个bug。进口报关单正本:

从“pg承诺”导入*作为pg承诺; 导致错误,如问题中所述。正确的语法是:

从“pg承诺”中导入pg承诺;
这是一个与javascript和ES6规范的转换相关的问题,而不是特定于pg promise

解决此问题的方法至少有两种:

使用不同的语法: 从“pg承诺”中导入pg承诺; 此行按原样导入本例函数中的默认导出对象。在我看来,它比示例中使用并由模块作者推荐的下一行更短,更直观:

从“pg承诺”导入*作为pg承诺; 要求导入的对象是对象,因为*意味着将其所有属性导入主命名空间,因此它确实导入所有导出的属性,但不导入函数,因为函数未分配给属性,所以它是对象本身

为了更详细地解释差异

这是一个普通对象:

//模块-p.js 设p={name:'John',color:'blue',age:1263} 导出缺省p; 这是一个具有以下属性的函数对象:

设p=x=>{console.logx;}; p、 姓名=‘约翰’; p、 颜色=蓝色; p、 年龄=1263岁; 导出缺省p; 后者,当通过

从“模块-P”导入*作为P; 将导入对象属性名称、颜色和年龄,并将它们指定给当前命名空间中的对象。但是,它不会从上面的示例中导入函数p,因为它在p中没有命名属性

快速而肮脏的解决方案是修复tsconfig.json中的选项esModuleInterop: esModuleInterop:true 到

esModuleInterop:false 更改该选项将启用javascript模块pg promise和以类似javascript样式编写的其他模块所需的轻松模块导入处理

说:

默认情况下,使用esModuleInterop false或not set TypeScript时,CommonJS/AMD/UMD模块与ES6模块类似。在这样做的过程中,有两个部分被证明是有缺陷的假设:

名称空间导入(如import*as moment from moment)的作用与const moment=requirement相同

默认导入(如导入力矩from moment)与const moment=requirement.default的作用相同

这种不匹配导致以下两个问题:

ES6模块规范规定,命名空间导入*作为x只能是一个对象,方法是让TypeScript将其视为=requirex,然后让TypeScript将导入视为函数并可调用。这违反了规范的建议

虽然符合ES6模块规范,但大多数带有CommonJS/AMD/UMD模块的库并不像TypeScript的实现那样严格

pg promise导入依赖于特定的Typescript transpiler配置的原因似乎是,导出的命名空间是函数,而不是对象,这在esModuleInterop=true时是不允许的。pg promise文档未提及任何特定的typescript配置依赖项或要求


遗憾的是,pg promise的作者决定在这里留下傲慢的评论,而不是在回答中指出打字脚本问题。

是一个简单的例子,但它看起来与您的代码类似。你可以找到一个TypeScript演示,正如我在问题中所描述的那样,它返回上面提到的错误。您是否尝试过在真实环境中运行它?是的,我下载了演示,进入文件夹TypeScript,用npm I@types/express安装了@types/express,并用最新的TypeScript版本进行了传输。它起作用了。没有错误。没有警告,快车???我说的是pg承诺。我什么都不需要快递。应该足够了。如果它不起作用,你这边一定有问题。该库没有详细介绍TypeScript,因为
这与JavaScript相同,没有bug。这就是您的TypeScript配置问题。您的项目已设置为使用默认导入和esModuleInterop。这就是它强制默认导入的原因。这是TypeScript基础,pg-promise没有问题。Vitaly,我认为您应该修复您的自我描述:我对StackOverflow提供了大量支持,帮助开发人员使用我在GitHub上开发的库以及一些新技术。我建议修改它,让我在StackOverflow上展示自己,向开发人员解释我开发的库是完美无瑕的,并告诉他们要努力学习,自己解决这些问题。这两个选项中,哪一个更好地描述了你在这里的展览,你认为呢?顺便说一句,有句谚语说没有错误的问题,只有错误的答案。还有一些需要考虑的问题……有一条警告消息提示解决方案1:src/read adif.ts:3:1 import*作为“pg promise”中的pgPromise~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~类型源自此导入。无法调用或构造命名空间样式导入,这将导致运行时失败。考虑在这里使用默认导入或导入要求。这有什么问题?@维塔利-t