我们有一个文件,其中包含一个tsc
或vscode
无法识别的接口。
src/sap truck花名册/resolver/RosterResolver.ts:40:17-错误TS2304:找不到名称'Context'。
// srcsharedtypesContext.d.ts
import { Roster } from '@sap-truck-roster/entity/Roster'
import { Account } from '@it-portal/entity/Account'
interface Context {
user: Account
dataSources: {
sapRosterApi: Roster
}
}
显然,我们需要在这里建议的tsconfig
中使用选项typeRoots。但是由于这样或那样的原因,接口CCD_ 4仍然没有被识别。我们这里缺少什么?
{
"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/*
包的自动发现,并导致不可破解的问题。
只有当类型或接口位于.d.ts文件中时,以及当您没有从.d.ts中的任何模块导入任何类型时,才可以使用该类型或接口而不导入它。
您可以使用模块声明来实现这一点。
declare module SomeName {
interface Context {
user: Account
dataSources: {
sapRosterApi: Roster
}
}
}
现在你可以直接这样写了。
const ctx: SomeName.Context = {} // without importing anything
从更新tsconfig.json
"typeRoots": ["./node_modules/@types", "./src/shared/types/**/*.d.ts"],
至
"typeRoots": ["./node_modules/@types", "./src/shared/types"],
这必须奏效。如果没有,请告诉我。
Codesandbox:https://codesandbox.io/s/ecstatic-tdd-tb11c?file=/src/App.tsx