继续从 #22228
cc @evil-shrike
我遇到了这个问题。
@mhegazy 说
库的根目录下要么有 "types": "index.ts"
文件,要么有 .ts
文件,这是错误的。一个库不应该暴露其源代码,只应该暴露其声明。
但是像推断返回类型(例如在创建类工厂混入时)这样的功能无法编译到声明文件中,导致错误,如
error TS4025: Exported variable 'html' has or is using private name 'htmlBind'.
error TS4031: Public property '_currentArea' of exported class has or is using private name 'AreaInternal'.
error TS4055: Return type of public method from exported class has or is using private name 'PartHelper'.
error TS4073: Parameter 'partHelper' of public method from exported class has or is using private name 'PartHelper'.
error TS4078: Parameter 'options' of exported function has or is using private name 'ExtendOptions'.
.d.ts 文件没有表达式,它表示 API 的形状。
这并不完全正确。
据我所知,唯一在下游项目中使用声明文件不支持的功能的方法是从 .ts
源文件直接获取类型。这使得将 types
指向 .ts
源文件成为一个有效的用例。
这是我认为应该发生的事情:
如果 "types"
指向一个 .ts
文件,而 "main"
指向一个 .js
文件,那么编译器应该仅使用 .ts
文件进行类型定义,而不编译或检查代码。"main"
可以作为指导告诉编译器是否应该编译源代码,或者读取 js 文件。"types"
应该用于指定 类型的 来源。
除非我错过了什么,否则没有其他方法可以包含无法在声明文件中表示的功能的类型。
为什么声明功能与源功能不匹配?似乎一个重要的目标应该是让声明功能始终具有匹配源功能的潜力。
7条答案
按热度按时间mbjcgjjk1#
顺便说一下,当我们制作像类工厂混合物这样的东西,然后尝试发出声明文件时,我们会遇到像#23110中描述的问题。
fykwrbwg2#
如果我们在声明文件中不能使用隐式返回类型等,并且我们不应该将
"types"
指向.ts
源文件,那么我们应该怎么办?vmdwslir3#
如何以某种方式在声明文件中支持TS的所有功能?
或许隐式返回类型可以这样:
其中没有实现。它看起来像是
{}
中的实现,但也许它仅限于包含类型和返回类型,或者类似的东西。我们只需要定义规则。icomxhvb4#
功能请求:允许
types
字段指向源文件.ts
,然后阻止编译器对内部进行类型检查,只需使用这些文件作为与消费相关的类型信息。我是否应该为此专门开一个新问题?kmb7vmvb5#
你最近合并了#32028。这个问题是否意味着我们可以关闭这个?你能也检查一下我在那个PR中的评论吗?
nsc4cvqm6#
根据@RyanCavanaugh在#40431(评论)中的建议,PR #32028 在内存中编译为
.d.ts
文件,然后依赖于这些虚拟声明文件。如果是这样,我认为这可以作为解决此问题的方法,如果尚未这样做的话。
基本上,tsc 会查看
types
在package.json
中,然后为该内容在内存中生成.d.ts
,而不是使用源文件。你觉得怎么样?hts6caw37#
基本上,tsc会查看
types
在package.json
中,然后为该内存生成.d.ts
,而不是使用源文件。Wdyt?这个想法只有一个问题:#35822中列出的所有问题都会发生,并导致关于“私有名称”等的错误。