如何在TypeScript的模块中找到类的名称

时间:2017-11-21 13:01:36

标签: node.js typescript fs

所以在这段代码中:

import * as fs from "fs"

class FsAsyncFactory {

    private static fsSync: any

}

export default FsAsyncFactory

我已将此道具private static fsSync: any的类型设为any,但它将成为顶部导入的fs变量 - 我如何弄清楚该类的内容被称为?

我猜到FileSystem之类的东西,但它没有用。我对TypeScript的理解不够深入,无法弄明白。

我的开发依赖项中有"@types/node": "^8.0.50",而我已进入node_modules/@types/node/index.d.ts,但我看不到任何有意义的内容?谢谢!

1 个答案:

答案 0 :(得分:1)

您可以使用typescript的“type of”命令。

import * as fs from "fs"

class FsAsyncFactory {

   private static fsSync: typeof fs

}

export default FsAsyncFactory

然后在课堂内

constructor(){
 //...//
 FsAsyncFactory.fsSync. //ide recognizes fsSync is of type "fs" and gives you full prediction of fs functions
 //...//
}

问题:这种类型是什么以及为什么我只能使用类名?

基本上我理解通过阅读node/index.d.ts fs只是一个正在导出的模块。基本上是一个带有某些类型函数的对象,带有自己的文档。在这种情况下,我们没有类名或接口来声明我们的其他变量等于fs。 typescript的typeof命令是类型查询,基本上如果在源变量上没有实现类或接口,它只会期望源的相同属性在目标中呈现。

您的问题的另一种方法可能是使用类型别名

import * as fs from "fs"
type FileSystem = typeof fs

class FsAsyncFactory {

   private static fsSync: FileSystem

}

export default FsAsyncFactory

这将创建一个名为FileSystem的新类型,它将期望声明为FileSystem类型的每个对象实现fs模块的每个函数。

问题:如何使用Bluebird的promisifyAll打字稿?

import * as fs from "fs"
import * as Bluebird from "bluebird"

const fsProm : FileSystem = Bluebird.promisifyAll(fs)

fsProm.writeFile('filename','some data') // Typescript error function expects at least 3 parameters
   .then(console.log) 

不幸的是,从我的观点来看,promisifyAll会将严格类型的函数更改为其他内容而不会留下任何已更改的定义,这对于打字稿来说非常糟糕。经过一些搜索后,我找不到任何适用于所有情况的可靠解决方案,请查看issue。 也许你最好的办法就是声明你的promisidied变量来输入any并继续工作而不用intellisense。