首页 > 解决方案 > 在 .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。但由于某种原因,该界面仍然无法识别。我们在这里缺少什么?tsconfigContext

{
  "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,
    })
  }
}

标签: typescripttsconfig

解决方案


不进行导出会阻止 TS 发现它。

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

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

如果你想全局声明一个接口,你应该通过扩充全局模块来做到这一点

在你的情况下,它会是

declare global {
  interface Context {
    user: Account
    dataSources: {
      sapRosterApi: Roster
    }
  }
}

但是我强烈建议不要这样做,将来可能会让您感到痛苦

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

弄乱typeRoots选项通常还会禁用@types/*包自动发现并导致无法调试的问题。


推荐阅读