所以在这段代码中:
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
,但我看不到任何有意义的内容?谢谢!
答案 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。