IDE未找到声明的全局类型

ser*_*dat 5 import types typescript tsconfig

我有一个全局输入文件,我在其中定义我的类型,变量等...

现在项目结构是这样的:

trunk
   typings
     index.d.ts
   src
     Example.ts
     Example.d.ts
   tsconfig.json
Run Code Online (Sandbox Code Playgroud)

在index.d.ts我已经让我们说

declare type userInfo = {
    username: string,
    password: string,
}
Run Code Online (Sandbox Code Playgroud)

但是Example.d.ts当我userInfo直接使用IDE时,它说找不到名字,而tsc编译器没有显示错误.

declare class Something {
   ...
   getUserInfo: () => userInfo; // <--- this is highlighted red
}
Run Code Online (Sandbox Code Playgroud)

有趣的是,当我使用userInfo时Example.ts,没有突出显示的错误.

另一个有趣的事情是,当go to the declaration它跳到正确的行index.d.ts

我不会在两个文件中导入类型,因为它们是global类型.

我的tsconfig文件如下:

{
    "compilerOptions": {
        ...
        "typeRoots": ["./typings"],
        ...
    },
    ...
}
Run Code Online (Sandbox Code Playgroud)

可能是什么问题?

Nur*_*yev 3

您不应该声明类型。当你想要表明全局变量作用域中有一些javascript类(因此 Typescript 无法看到它)时,Declare 很有用。例如:

declare class UserInfo {...} // typings.d.ts
Run Code Online (Sandbox Code Playgroud)

现在你应该使用的是常规的type

type UserInfo = {...} // Example.ts
Run Code Online (Sandbox Code Playgroud)

更好的是,我建议您在您的情况下使用接口,因为 UserInfo 类型似乎很简单:

// Example.ts
interface UserInfo {
  username: string,
  password: string,
} 
Run Code Online (Sandbox Code Playgroud)

如果您没有得到什么,请随时问我

  • @jackop 你也删除了“example.d.ts”吗?您是否导入了“UserInfo”接口?TypeScript 代码不需要 d.ts 文件,并且我在 VS Code 中始终可以使用我声明和导入的任何类型的类型信息。这是正确的答案。 (2认同)
  • @jackjop,如果接口位于“.ts”文件中,则需要导入接口。当它位于“d.ts”文件中时,您不需要导入它。`MediaStream` 位于 `node_modules/typescript/lib.dom.d.ts` 中,这就是为什么您无需导入即可使用它。由于某种原因,我总是将接口放在“.ts”文件中,也许是因为我喜欢明确的东西,而不喜欢全局的东西。据我所知,许多开发人员都使用相同的方法。恕我直言,您应该这样做,除非您的应用程序非常小并且您确定不会有两个同名的界面。 (2认同)
  • 这并不能回答问题。TS 确实支持 global.d.ts 是有原因的 (2认同)