ChatGPT解决这个技术问题 Extra ChatGPT

Angular 2 单元测试:找不到名称“描述”

我在关注this tutorial from angular.io

正如他们所说,我创建了 hero.spec.ts 文件来创建单元测试:

import { Hero } from './hero';
describe('Hero', () => {
  it('has name', () => {
    let hero: Hero = {id: 1, name: 'Super Cat'};
    expect(hero.name).toEqual('Super Cat');
  });
  it('has id', () => {
    let hero: Hero = {id: 1, name: 'Super Cat'};
    expect(hero.id).toEqual(1);
  });
});

单元测试就像一个魅力。问题是:我看到一些错误,在教程中提到:

我们的编辑器和编译器可能会抱怨他们不知道它和期望是什么,因为他们缺少描述 Jasmine 的打字文件。我们现在可以忽略那些烦人的抱怨,因为它们是无害的。

他们确实忽略了它。尽管这些错误是无害的,但当我收到一堆错误时,它在我的输出控制台中看起来并不好。

我得到的示例:

找不到名称“描述”。找不到名称“它”。找不到名称“期望”。

我能做些什么来修复它?

您可以在 Github 上投票以修复此错误:github.com/TypeStrong/atom-typescript/issues/1125

L
Liam

我希望你已经安装 -

npm install --save-dev @types/jasmine

然后将以下导入放在 hero.spec.ts 文件的顶部 -

import 'jasmine';

它应该可以解决问题。


根据所需的 Typescript 版本,您可能需要安装早期版本。例如,对于我当前使用的使用 typescript v2.0.9 的 ionic v2.2.1,我需要安装 @types/jasmine@2.5.41。否则您可能会看到 these compilation errors
您可以只导入模块以获取其副作用:import 'jasmine';
import {} from 'jasmine'; 实际上是做什么的?和import 'jasmine'一样吗?
在 ANGULAR 6.0.3 中:我刚刚导入了“import {} from jasmine”,它又可以工作了
@aesede 你运行什么版本的 PS?我刚刚执行了没有任何引号的命令,并且运行良好。
S
Slava Fomin II

使用 Typescript@2.0 或更高版本,您可以安装类型:

npm install -D @types/jasmine

然后使用 tsconfig.json 中的 types 选项自动导入类型:

"types": ["jasmine"],

此解决方案不需要在每个规范文件中包含 import {} from 'jasmine';


根据 tsconfig.json(此时为 v2.1)的 TypeScript 文档,不再需要添加 "types": ["jasmine"] 行。 “默认情况下,所有可见的“@types”包都包含在您的编译中。任何封闭文件夹的 node_modules/@types 中的包都被认为是可见的;具体来说,这意味着 ./node_modules/@types/、../node_modules/@ 中的包类型/、../../node_modules/@types/ 等等。”
@bholben 我知道,但由于某种原因,未检测到 nodejasmine 类型。至少它对我不起作用,我正在使用 Typescript@2.1.5
此解决方案对我不起作用 :(,抱歉。我在 ang-app/e2e/tsconfig.json 中使用过。我在每个 json 级别都尝试过。您能否添加更多详细信息?
这在使用 webpack 时不起作用 - 在这种情况下需要提供实际的库 - import {} from 'jasmine' 会推动库通过
这对我有用,但我还必须将我的全局打字稿升级到 3.5.3(从 2.5)
l
lenny
npm install @types/jasmine

正如一些评论中提到的,不再需要 "types": ["jasmine"],所有 @types 包都自动包含在编译中(我认为是 v2.1 起)。

在我看来,最简单的解决方案是排除 tsconfig.json 中的测试文件,例如:

"exclude": [
    "node_modules",
    "**/*.spec.ts"
]

这对我有用。

更多信息见官方tsconfig docs


请注意:新的 Angular 项目有 src/tsconfig.app.jsonsrc/tsconfig.spec.jsontsconfig.json。提到的“排除”部分是第一个部分的一部分。 "types": [ "jasmine" ] 第 2 部分。
请注意,在 VS Code 中,您无法在规范文件中查找引用,因为它们不会被视为项目的一部分。
@mleu我面临同样的问题。你是如何解决这个问题的?每次编写测试用例时,我都必须从 exclude 块中删除规范文件模式。
@ShishirAnshuman:我没有找到解决方案,不得不忍受这个限制,直到项目结束。
@mleu 哦。没有任何问题。在我的项目中,作为一种解决方法,我从 tsconfig 的 exclude 块中删除了规范文件模式。然后我创建了一个新的 tsconfig.build.json 文件,并将 spec 文件模式添加到 exclude 块中。现在,在我的 ts-loader 选项中(在 webpack.config 中),我使用的是 tsconfig.build.json。使用这些配置,模块在测试文件中被解析,并且在创建构建或启动服务器时,测试文件被排除在外。
L
Liam

您需要为茉莉花安装类型。假设您使用的是相对较新的 typescript 2 版本,您应该能够:

npm install --save-dev @types/jasmine

m
mvermand

使用 Typescript@2.0 或更高版本,您可以使用 npm install 安装类型

npm install --save-dev @types/jasmine

然后使用 tsconfig.json 中的 typeRoots 选项自动导入类型。

"typeRoots": [
      "node_modules/@types"
    ],

此解决方案不需要 import {} from 'jasmine';在每个规范文件中。


不幸的是,这不起作用。它仍然显示规范文件中的错误
C
Community

这个问题的解决方案与他回答中的@Pace has written有关。但是,它并不能解释一切,所以如果您不介意,我会自己写。

解决方案:

添加这一行:

///<reference path="./../../../typings/globals/jasmine/index.d.ts"/>

hero.spec.ts 文件的开头修复了问题。路径指向 typings 文件夹(存储所有类型)。

要安装类型,您需要在项目的根目录中创建 typings.json 文件,其中包含以下内容:

{
  "globalDependencies": {
    "core-js": "registry:dt/core-js#0.0.0+20160602141332",
    "jasmine": "registry:dt/jasmine#2.2.0+20160621224255",
    "node": "registry:dt/node#6.0.0+20160807145350"
  }
}

并运行 typings install(其中 typings 是 NPM 包)。


这是这样做的非标准方式。默认 tslint 规则将阻止引用路径。使用 tsconfig 文件指向 node_modules
m
moppag

就我而言,解决方案是删除我的 tsconfig.json 中的 typeRoots

正如您在 TypeScript doc 中所读到的

如果指定了 typeRoots,则仅包含 typeRoots 下的包。


O
Omer Gurarslan

为了使 TypeScript 编译器在编译期间使用所有可见的类型定义,应从 tsconfig.json 文件的 compilerOptions 字段中完全删除 types 选项。

compilerOptions 字段中存在一些 types 条目,同时缺少 jest 条目时,就会出现此问题。

因此,为了解决此问题,您的 tscongfig.json 中的 compilerOptions 字段应在 types 区域中包含 jest 或完全删除 types

{
  "compilerOptions": {
    "esModuleInterop": true,
    "target": "es6",
    "module": "commonjs",
    "outDir": "dist",
    "types": ["reflect-metadata", "jest"],  //<--  add jest or remove completely
    "moduleResolution": "node",
    "sourceMap": true
  },
  "include": [
    "src/**/*.ts"
  ],
  "exclude": [
    "node_modules"
  ]
}

这对我有用,我在 types 选项中有 google map types。完全删除该选项后,它工作正常。
是的。我只需要删除类型的东西就可以了! <3
L
Liam

我到今天为止是最新的,发现解决此问题的最佳方法是什么都不做...不typeRootstypesexcludeinclude所有默认值似乎都工作得很好.实际上,在我将它们全部删除之前,它并不适合我。我有:

"exclude": [
    "node_modules"
]

但这是默认设置,所以我删除了它。

我有:

"types": [
    "node"
]

克服一些编译器警告。但现在我也删除了它。

不应出现的警告是:来自 node_modules\@types\graphql\subscription\subscribe.d.tserror TS2304: Cannot find name 'AsyncIterable'.

这非常令人讨厌,所以我在 tsconfig 中执行了此操作,以便加载它:

"compilerOptions": {
    "target": "esnext",
}

因为它在 esnext 集中。我没有直接使用它,所以暂时不用担心兼容性。希望以后不要烧死我。


您不需要在 tsconfig.json 中添加 "types": ["node"],但您应该在 tsconfig.app.json 中添加此类型!我认为你不应该再收到这个警告。您现在可以保留 "target": "es5""target": "es6"
E
Eslam Mahgoub

我将在 "typescript": "3.2.4" 中添加对我有用的答案

安装类型 jasmine npm install -D @types/jasmine

添加到 tsconfig.json jasmine/ts3.1 "typeRoots": [ ... "./node_modules/jasmine/ts3.1" ],

将 Jasmine 添加到类型 "types": [ "jasmine", "node" ],

注意:不再需要这个 import 'jasmine';


L
Liam

只需执行以下操作即可在存在多个 node_modules 的 Lerna Mono-repo 中获取 @types。

npm install -D @types/jasmine

然后在每个模块或应用程序的每个 tsconfig.file

"typeRoots": [
  "node_modules/@types",
  "../../node_modules/@types" <-- I added this line
],

默认情况下,所有可见的“@types”包都包含在您的编译中。任何封闭文件夹的 node_modules/@types 中的包都被认为是可见的;具体来说,这意味着 ./node_modules/@types/、../node_modules/@types/、../../node_modules/@types/ 等中的包。请参阅official documentation
K
King James Enejo

就我而言,我在提供应用程序时遇到此错误,而不是在测试时。我没有意识到我的 tsconfig.app.json 文件中有不同的配置设置。

我以前有这个:

{
  ...
  "include": [
    "src/**/*.ts"
  ]
}

在提供应用程序时,它包括了我的所有 .spec.ts 文件。我更改了 include property toexclude` 并添加了一个正则表达式来排除所有测试文件,如下所示:

{
  ...
  "exclude": [
    "**/*.spec.ts",
    "**/__mocks__"
  ]
}

现在它按预期工作。


J
Jadamae77

我在角度库中遇到了这个错误。结果我不小心将我的 .spec 文件包含在我的 public-api.ts 的导出中。删除导出解决了我的问题。


G
G.Vitelli

查看导入可能您有 循环依赖,在我的情况下这是错误,使用 import {} from 'jasmine'; 将修复控制台中的错误并使代码可编译但不会删除魔鬼的根(在我的情况下,循环依赖)。


K
Kalamarico

我在 Angular 6、Typescript 2.7 上,并且正在使用 Jest 框架进行单元测试。我在 tsconfig.json 内的 typeRoots 上安装并添加了 @types/jest

但仍然有下面的显示错误(即:在终端上没有错误)

找不到名称描述

并添加导入:

import {} from 'jest'; // in my case or jasmine if you're using jasmine

在技术上没有做任何事情,所以我想,有一个导入导致这个问题,然后我发现,如果删除文件

tsconfig.spec.json

src/ 文件夹中,为我解决了问题。因为 @types 是在 rootTypes 之前导入的。

我建议你这样做并删除这个文件,里面不需要配置。 (ps:如果你和我一样的话)


c
cfphpflex

如果错误在 .specs 文件 app/app.component.spec.ts(7,3) 中:错误 TS2304:找不到名称“beforeEach”。

将此添加到文件顶部并 npm install rxjs

从'rxjs'导入{范围};从'rxjs/operators'导入{地图,过滤器};


为什么安装和导入未使用的功能有助于解决打字问题?我怀疑这真的是一个有效的答案

关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅