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



我们有一个文件,其中包含一个tscvscode无法识别的接口。

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

最新更新