首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >TSNode + Mocha:忽略TypeScript错误(使编译器发出错误并使TSNode执行发出的代码)

TSNode + Mocha:忽略TypeScript错误(使编译器发出错误并使TSNode执行发出的代码)
EN

Stack Overflow用户
提问于 2020-05-02 01:48:01
回答 2查看 1.2K关注 0票数 2

在下面的代码中,虽然函数test2无效,但它不应该影响函数test1的测试。

代码语言:javascript
运行
复制
export function test1(): boolean {
  return true;
}

export function test2(): number {
  return "1";
}

测试:

代码语言:javascript
运行
复制
import { assert as Assert } from "chai";
import { test1 } from "./example";


describe("Example", (): void => {
  it("Example", (): void => {
    Assert.isTrue(test1());
  });
});

但是,由TSNode执行的Mocha将失败:

代码语言:javascript
运行
复制
TSError: ⨯ Unable to compile TypeScript:
Source/ProjectBuilder/example.ts(6,3): error TS2322: Type '"1"' is not assignable to type 'number'.

有可能迫使TSNode完成上述测试吗?TypeScript有选择noEmitOnError..。

我的mocharc.yaml:

代码语言:javascript
运行
复制
extension:
  - ts
spec: "**/*.test.ts"
require:
  - ts-node/register
  - tsconfig-paths/register

为什么我需要它

根据Clean ,“业务规则不能依赖于任何东西,它必须是可测试的”。但是,即使业务规则不依赖于视图、控制器等,我们也无法测试视图、控制器等中是否存在错误。

当我在应用程序中修改业务逻辑时,依赖它的所有内容都将失效。假设在业务逻辑中的实体中,type User { name: string; age: number }已更改为用户{ fullName: string; age: string; }类型。所有这些都依赖于业务逻辑(视图、控制器、演示程序等)变得无效-我也需要纠正它根据业务逻辑更新。

代码语言:javascript
运行
复制
// In business rules:

type User = { 
  ID: number;
  fullName: string; 
  age: string; // in past - number
}

// In controller:

class UserProfileController {
  // ...
  // All what comes from input field is string    ↓
  private onClickChangeUserAge(inputtedUserAge: string) {
    // This expression obeys to previous version of business rules!
    this.targetUser.age = Number(inputtedUserAge);
    // TypeScript will emit type error, when I try to test business rules,
    // however business rules does not depend on controller.
  }
}

然而,在大应用中,这种修正可能需要几天、几周甚至几个月。我们如何才能得到反馈,证明至少业务逻辑工作正常,而且我们的方法是正确的?

EN

回答 2

Stack Overflow用户

发布于 2020-05-05 01:28:46

对你来说,要求打字稿忽略类型是没有意义的。你所描述的类似于要求一个计算器来确认2+2= 5,只是暂时的,因为最终你会要求2+3=5,但这可能需要很长的时间。

问题中的假设是,numberstring具有足够的兼容性,无论test2返回1还是"1",您的业务逻辑都是合理的。这不是真的:举个例子,1 + 1 == 2"1" + 1 == "11""1" - 1 == 0。根据这些应用于您的情况,忽略类型可能允许您测试您的业务逻辑,或者可能给您对已损坏的系统的错误信心。我敢打赌,一般来说,数据类型作为您要验证的业务逻辑的一部分,--如果不是业务逻辑,数据模型算得上是什么?

相反,您所描述的是一种渐进式迁移,在此期间,业务规则确保test2返回string | number。通过准确地描述类型系统中的迁移,您可能能够确认业务逻辑应用正确--如果在迁移过程中是这样的话--还可以提供一种类型,您只能从某些模块和调用站点中应用该类型,这些模块和调用站点可以在完成迁移时得到加强。

票数 1
EN

Stack Overflow用户

发布于 2020-05-06 08:51:39

代码语言:javascript
运行
复制
type User = { 
  ID: number;
  fullName: string; 
  age: string | number
}

您可以指定这两种类型,以使迁移更容易,而不是在任何地方都使用//@ts-ignore

这将在任何地方增加适当的建议,例如:

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61553461

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档