TypeScript版本:
版本2.6.2
搜索词:
模块导出功能的声明文件,外部模块,npm软件包,第三方模块
码
src/testFile.ts
:
import getFieldList = require('graphql-list-fields');
src/@types/graphql-list-fields/index.d.ts
:
// Doing just this below (as suggested by the Typescript Handbook does not work
// and results in the tsc error under **Actual behavior** below
import { GraphQLResolveInfo } from 'graphql';
declare function getFieldList(info: GraphQLResolveInfo): string[];
export = getFieldList;
// The code below is what actually works instead of the above
/*
declare module 'graphql-list-fields' {
import { GraphQLResolveInfo } from 'graphql';
function getFieldList(info: GraphQLResolveInfo): string[];
export = getFieldList;
}
*/
预期行为:
编译没有错误。
实际行为:
运行tsc
时出错:
src/testFile.ts(1,31): error TS7016: Could not find a declaration file for module 'graphql-list-fields'. '/node_modules/graphql-list-fields/index.js' implicitly has an 'any' type.
Try `npm install @types/graphql-list-fields` if it exists or add a new declaration (.d.ts) file containing `declare module 'graphql-list-fields';`
graphql-list-fields
是我要使用的NPM程序包,目前没有发布的类型声明。
阅读《打字稿手册》中有关声明文件的部分后,我发现我正在尝试为模块化库编写声明文件,应使用module-function.d.ts声明文件模板。 这就是我上面index.d.ts
的代码的方式,但是编译器仍然抱怨没有模块'graphql-list-fields'的声明文件。 经过反复试验,我们发现在所有内容周围添加declare module 'graphql-list-fields'
正常工作,而不会产生编译器错误。
如tsconfig文档中所述,我们尝试在tsconfig.json
设置"typeRoots": ["./node_modules/@types", "./src/@types"]
,但是如果没有declare module 'graphql-list-fields'
仍然无法使用。 这似乎是一个问题,因为tsc在typeRoots中指定的目录中找不到类型声明。
"typeRoots"
用于全局代码。 即在全局名称空间中声明的某些内容,并且您想要包含它。 这就是您的declare module 'graphql-list-fields' {..
工作的原因,因为它只是在全局名称空间中声明了具有该名称的模块。
对于模块,它们具有自己的作用域,您只需要path mappig ..
有点像:
{
"compilerOptions": {
"target": "es5",
"baseUrl": "./",
"paths": {
"*" : ["src/@t`ypes/*"]
}
}
}`
感谢您清除@mhegazy。 我认为如果在TypeScript文档(可能在声明文件部分下)中对此进行了更多说明,将很有帮助。
TypeRoots是真的,我们已经添加了回COMPAT与支持分型,并允许迁移,所以我们试图尽可能地保持它的文档,以避免混乱。
不知道这是否适合声明文件部分。 我们在https://www.typescriptlang.org/docs/handbook/module-resolution.html#path -mapping中确实对此有注释
我可以在声明文件部分添加有关模块解析部分的注释。
请对该部分进行阅读,并让我们知道您是否仍然缺少该文档
哦,我懂了。 是的,那是我需要开始的页面。 我认为最好至少简短地提及路径映射,并且可能会在https://www.typescriptlang.org/docs/handbook/declaration-files/introduction.html下的某个地方链接到该文档
自动关闭此问题以进行内务处理。 问题标签表明它目前无法操作或已被解决。
我仍然认为按照我以前的评论@ typescript-bot中所述更新文档会有所帮助
TypeRoots是真的,我们已经添加了回COMPAT与支持分型,并允许迁移,所以我们试图尽可能地保持它的文档,以避免混乱。
@mhegazy具有几乎没有文档的受支持功能是造成混乱的原因。 请正确记录此类功能,但请谨慎使用警告语言。 例如:
_注意:提供此功能是为了与类型向后兼容以支持迁移。 有关更多信息,请参见发行说明[此处]。_
比不得不扫描GitHub Issues,StackExchange等获取信息要好得多。
Thx一个他妈的吨@mhegazy ! :tada: @types
路径条目最终丢失了,这使我的非标准项目设置工作了。 我花了几天的时间。
如果您不介意减慢应用程序的启动过程,只需将TS_NODE_FILES=true
到package.json的启动脚本中,即可找到所有自定义声明文件。
我现在得到:
The following changes are being made to your tsconfig.json file:
- compilerOptions.paths must not be set (aliased imports are not supported)
并且此选项被删除。
@KrzysztofMadejski由CRA完成,而不是由TS本身完成。
该线程表示typeroots实际上是为了向后兼容。 我正在尝试使用它来为确定类型的类型创作类型。 没有typeroot,我还应该如何正确测试这些类型? 我已经使用dts-gen
生成了类型并将types
到我的类型根目录中,但仍然没有运气:-(
@Roaders您是否找到了使用dts-gen
生成的类型的解决方案?
编辑:使用https://github.com/microsoft/TypeScript/issues/22217#issuecomment -369783776解决
我不明白的一件事是:
tsconfig.base.json:
"typeRoots": ["node_modules/@types", "types"],
和目录结构:
/node_modules/@types/something/index.d.ts
/types/something-else/index.d.ts
在我的nrwl / nx存储库中根本不会拾取它。 我可以尝试一百万种东西,但是如果我将something-else
文件夹移至node_modules/@types
它将神奇地工作并被捡起,这表明typeRoots
绝对没有作用,就像node_modules/@types
被神奇地处理了。
将typeRoots标记为已弃用,并说它以一种奇怪/古怪的方式工作,至少会阻止我尝试使用它。
我每次设法添加本地类型的唯一方法是,花费数小时与tsconfig.base.json进行斗争,并绊倒在上面的超级注释中
我一直对此感到困扰,而忘记了也必须配置paths
选项,因此我创建了一个具有正确设置的简单存储库。 希望它能帮助某人。
最有用的评论
@mhegazy具有几乎没有文档的受支持功能是造成混乱的原因。 请正确记录此类功能,但请谨慎使用警告语言。 例如:
比不得不扫描GitHub Issues,StackExchange等获取信息要好得多。