在.d.ts文件中时无法识别TypeScript接口

在.d.ts文件中时无法识别TypeScript接口,typescript,tsconfig,Typescript,Tsconfig,我们有一个文件,其中包含一个不被tsc或vscode识别的接口 src/sap卡车花名册/resolver/RosterResolver.ts:40:17-错误TS2304:找不到名称“Context” //src\shared\types\Context.d.ts 从“@sap卡车花名册/实体/花名册”导入{花名册} 从'@it portal/entity/Account'导入{Account} 接口上下文{ 用户:帐户 数据源:{ 萨普罗斯特拉皮:名册 } } 显然,我们需要按照建议使用t

我们有一个文件,其中包含一个不被
tsc
vscode
识别的接口

src/sap卡车花名册/resolver/RosterResolver.ts:40:17-错误TS2304:找不到名称“Context”

//src\shared\types\Context.d.ts
从“@sap卡车花名册/实体/花名册”导入{花名册}
从'@it portal/entity/Account'导入{Account}
接口上下文{
用户:帐户
数据源:{
萨普罗斯特拉皮:名册
}
}
显然,我们需要按照建议使用
tsconfig
中的选项。但由于某种原因,仍然无法识别接口
上下文
。我们错过了什么

{
“编译器选项”:{
“baseUrl”:“,
“路径”:{
“@environment”:[“src/environment”],
“@utils/*”:[“src/utils/*”]
},
“类型根”:[“/node_modules/@types”,“/src/shared/types/***.d.ts”],
“rootDir”:“/src”,
“outDir”:“/dist”,
“目标”:“es6”,
},
“排除”:[“节点_模块”],
“包括”:[“/src/***.tsx”、“/src/***.ts”、“/src/***.d.ts”]
}
使用界面:

从'type graphql'导入{Resolver,Arg,Query,Ctx,Field,ObjectType,createUnionType}
从“@sap卡车花名册/实体/花名册”导入{花名册}
从“类转换器”导入{plainToClass}
@分解器()
导出类RosterResolver{
@查询(()=>RosterQueryResultUnion)
异步花名册(
@Ctx()Ctx:Context,//使用上下文而不导入
@Arg('date',()=>String)日期:String
):承诺{
const response=wait ctx.dataSources.sapRosterApi.get花名册(日期)
如果(response.returnCode==='OK'){
返回平级(罗斯特拉){
数据:response.data,
})
}
返回plainToClass(APIRROR{
代码:response.returnCode,
消息:response.errorMessage,
})
}
}
您可以使用模块声明来实现这一点

声明模块SomeName{
接口上下文{
用户:帐户
数据源:{
萨普罗斯特拉皮:名册
}
}
}
现在你可以直接这样写了

const ctx: SomeName.Context = {} // without importing anything
从更新tsconfig.json

"typeRoots": ["./node_modules/@types", "./src/shared/types/**/*.d.ts"],

这一定行得通。如果没有,请告诉我


Codesandbox:

不放置导出会阻止TS发现导出

.d.ts
文件旨在声明或扩充名称空间/模块,同时禁止任何其他ts操作,因为它们是纯声明文件

它们并不是为了避免使用导入/导出

如果要全局声明接口,应通过

在你的情况下是这样的

declare global {
  interface Context {
    user: Account
    dataSources: {
      sapRosterApi: Roster
    }
  }
}
但我强烈建议你不要这样做,这对你将来可能是一种痛苦

对于您来说,最好创建一个普通的
.ts
文件并导出接口,然后将其导入其他地方。 如果仍然不起作用,请检查tsconfig路径是否配置正确,或者切换到使用相对导入路径


混用
typeroot
选项通常也会禁用
@types/*
包的自动发现,并导致不可调试的问题。

为什么不导出它?使用
export
import
时,它工作正常。但是使用
.d.ts
文件的目的是不再需要该文件,并且该接口在全局范围内。您能否显示您希望如何访问该接口?当然,这似乎是明智的做法,但是当我尝试它时,我得到了
错误TS2503:找不到名称空间“SomeName”。
根据您的建议更新
tsconfig
后出现了相同的问题。即使累了按建议添加
导出
,也没有运气。它一定能工作。检查代码沙盒URL。它只有一个lint问题,代码运行良好。
declare global {
  interface Context {
    user: Account
    dataSources: {
      sapRosterApi: Roster
    }
  }
}