在.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
}
}
}