typescript - 在 .d.ts 文件中无法识别 TypeScript 接口
问题描述
我们有一个文件,其中包含一个无法被tsc
或识别的接口vscode
。
src/sap-truck-roster/resolver/RosterResolver.ts:40:17 - 错误 TS2304:找不到名称“上下文”。
// src\shared\types\Context.d.ts
import { Roster } from '@sap-truck-roster/entity/Roster'
import { Account } from '@it-portal/entity/Account'
interface Context {
user: Account
dataSources: {
sapRosterApi: Roster
}
}
显然我们需要按照这里的建议使用选项typeRoots。但由于某种原因,该界面仍然无法识别。我们在这里缺少什么?tsconfig
Context
{
"compilerOptions": {
"baseUrl": ".",
"paths": {
"@environment": ["src/environment"],
"@utils/*": ["src/utils/*"]
},
"typeRoots": ["./node_modules/@types", "./src/shared/types/**/*.d.ts"],
"rootDir": "./src",
"outDir": "./dist",
"target": "es6",
},
"exclude": ["node_modules"],
"include": ["./src/**/*.tsx", "./src/**/*.ts", "./src/**/*.d.ts"]
}
使用界面:
import { Resolver, Arg, Query, Ctx, Field, ObjectType, createUnionType } from 'type-graphql'
import { Roster } from '@sap-truck-roster/entity/Roster'
import { plainToClass } from 'class-transformer'
@Resolver()
export class RosterResolver {
@Query(() => RosterQueryResultUnion)
async roster(
@Ctx() ctx: Context, // use Context without import
@Arg('date', () => String) date: string
): Promise<typeof RosterQueryResultUnion> {
const response = await ctx.dataSources.sapRosterApi.getRoster(date)
if (response.returnCode === 'OK') {
return plainToClass(RosterArray, {
data: response.data,
})
}
return plainToClass(ApiError, {
code: response.returnCode,
message: response.errorMessage,
})
}
}
解决方案
不进行导出会阻止 TS 发现它。
.d.ts
文件旨在声明或扩充命名空间/模块,同时禁止任何其他 TS 操作,因为它们是纯声明文件。
它们并不是为了避免使用导入/导出。
如果你想全局声明一个接口,你应该通过扩充全局模块来做到这一点
在你的情况下,它会是
declare global {
interface Context {
user: Account
dataSources: {
sapRosterApi: Roster
}
}
}
但是我强烈建议不要这样做,将来可能会让您感到痛苦
对您来说,最好创建一个普通.ts
文件并导出界面,然后将其导入其他地方。如果这仍然不起作用,请检查 tsconfig 路径是否配置正确或切换为使用相对导入路径。
弄乱typeRoots
选项通常还会禁用@types/*
包自动发现并导致无法调试的问题。
推荐阅读
- robotframework - RobotFramework 的 java 库中的 libdoc
- apache-spark - 因超出内存限制而被 YARN 杀死的容器
- azure - 使用 JSONOutputer 将 Avro 文件转换为 JSON
- sql - 仅在某些产品时汇总数量
- java - 在 paint() 方法结束时调用 frame.repaint() 是否危险?
- mysql - 在 SELECT 语句之外操作变量
- asp.net - 在 asp.net 中的回发折叠面板
- python - 快速排序附加到递归列表?
- c# - Visual Studio 没有看到我的新代码
- android - Android Places SDK 最多返回 5 个结果