Typescript: typeRoots找不到自定义声明文件

创建于 2018-02-28  ·  15评论  ·  资料来源: microsoft/TypeScript



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中指定的目录中找不到类型声明。

相关问题:
30198335

Question

最有用的评论

TypeRoots是真的,我们已经添加了回COMPAT与支持分型,并允许迁移,所以我们试图尽可能地保持它的文档,以避免混乱。

@mhegazy具有几乎没有文档的受支持功能是造成混乱的原因。 请正确记录此类功能,但请谨慎使用警告语言。 例如:

_注意:提供此功能是为了与类型向后兼容以支持迁移。 有关更多信息,请参见发行说明[此处]。_

比不得不扫描GitHub Issues,StackExchange等获取信息要好得多。

所有15条评论

"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选项,因此我创建了一个具有正确设置的简单存储库。 希望它能帮助某人。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

Zlatkovsky picture Zlatkovsky  ·  3评论

seanzer picture seanzer  ·  3评论

DanielRosenwasser picture DanielRosenwasser  ·  3评论

blendsdk picture blendsdk  ·  3评论

dlaberge picture dlaberge  ·  3评论