typescript 为什么在代码中我不能使用类名作为类型注解?

31moq8wy  于 2023-06-30  发布在  TypeScript
关注(0)|答案(2)|浏览(136)

我在我的项目中安装了ts-morph:

ts-morph % tree .
.
├── LICENSE
├── dist
│   └── ts-morph.js
├── lib
│   └── ts-morph.d.ts
├── package.json
└── readme.md

lib/ts-morph.ts中,我找到了类Project的函数:

...
getDirectories(): Directory[];
...

但当我运行到使用getDirectories()如下将报告错误:

let tsmorph = require('ts-morph')
const { Directory } = tsmorph

const project = new tsmorph.Project();
project.addSourceFilesFromTsConfig('path/to/tsconfig.json')

console.log(Directory) // [class Directory]

const dirs: Directory[] = project.getDirectories() // this line occurs error.

dirs.forEach((item: any) => {
  console.log(item.getPath())
})

错误:

"Directory" represents a value, but is used here as a type. Does it mean "type Directory"? ts(2749) 
type Directory = /*unresolved*/ any

然后我把这一行改成

const dirs: typeof Directory[] = project.getDirectories()

这很有效。
但为什么它使用typeof Directory而不是Directory
我也在我的demo中测试:我认为应该使用Directory,没错。
我的演示代码如下:

class Demo {
  age: number = 18;
  getAge: () => {} = () => {
    return this.age  
  }
}

let demos:  Demo[] = [
  new Demo(),
  new Demo(),
  new Demo(),
]

console.log(demos)
wgx48brx

wgx48brx1#

当你

require('ts-morph')

您正在导入ts-morph.js。在你的代码中,

const { Directory } = tsmorph

Directory设置为类,而不是类型。

nimxete2

nimxete22#

由于JS是动态类型的,因此所有对象(字符串,数组等)在解释器级别都被视为相同,并且仅在运行时检查类型。根据我的理解,CommonJS导入(require导入)将模块作为对象返回,因此它可能只是将Directory类导出为没有TypeScript级别类型的JS类声明,而TypeScript级别类型只是一个JS值。所以我认为typeof操作符强制TypeScript从类声明中生成类型。
我认为像这样导入也应该导入类型:

import { Project, Directory } from 'ts-morph';

相关问题