TypeScript 在`package.json`中的"types"字段指向`node_modules`中的`.ts`文件会导致该文件被编译和类型检查,

jecbmhm3  于 6个月前  发布在  TypeScript
关注(0)|答案(7)|浏览(50)

继续从 #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" 应该用于指定 类型的 来源。
除非我错过了什么,否则没有其他方法可以包含无法在声明文件中表示的功能的类型。
为什么声明功能与源功能不匹配?似乎一个重要的目标应该是让声明功能始终具有匹配源功能的潜力。

mbjcgjjk

mbjcgjjk1#

顺便说一下,当我们制作像类工厂混合物这样的东西,然后尝试发出声明文件时,我们会遇到像#23110中描述的问题。

fykwrbwg

fykwrbwg2#

如果我们在声明文件中不能使用隐式返回类型等,并且我们不应该将 "types" 指向 .ts 源文件,那么我们应该怎么办?

vmdwslir

vmdwslir3#

如何以某种方式在声明文件中支持TS的所有功能?
或许隐式返回类型可以这样:

export declare function AwesomeMixin<T extends Constructor>(Base: T) {
  type Foo = SomeOtherType<T> // only types allowed in here.
  
  // only special return statements allowed, or something.
  return declare class Awesome extends Base {
    method(): Foo
  }
}

其中没有实现。它看起来像是 {} 中的实现,但也许它仅限于包含类型和返回类型,或者类似的东西。我们只需要定义规则。

icomxhvb

icomxhvb4#

功能请求:允许 types 字段指向源文件 .ts,然后阻止编译器对内部进行类型检查,只需使用这些文件作为与消费相关的类型信息。我是否应该为此专门开一个新问题?

kmb7vmvb

kmb7vmvb5#

你最近合并了#32028。这个问题是否意味着我们可以关闭这个?你能也检查一下我在那个PR中的评论吗?

nsc4cvqm

nsc4cvqm6#

根据@RyanCavanaugh在#40431(评论)中的建议,PR #32028 在内存中编译为 .d.ts 文件,然后依赖于这些虚拟声明文件。
如果是这样,我认为这可以作为解决此问题的方法,如果尚未这样做的话。
基本上,tsc 会查看 typespackage.json 中,然后为该内容在内存中生成 .d.ts,而不是使用源文件。你觉得怎么样?

hts6caw3

hts6caw37#

基本上,tsc会查看typespackage.json中,然后为该内存生成.d.ts,而不是使用源文件。Wdyt?
这个想法只有一个问题:#35822中列出的所有问题都会发生,并导致关于“私有名称”等的错误。

相关问题