在下面的代码中,虽然函数test2无效,但它不应该影响函数test1的测试。
export function test1(): boolean {
return true;
}
export function test2(): number {
return "1";
}测试:
import { assert as Assert } from "chai";
import { test1 } from "./example";
describe("Example", (): void => {
it("Example", (): void => {
Assert.isTrue(test1());
});
});但是,由TSNode执行的Mocha将失败:
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:
extension:
- ts
spec: "**/*.test.ts"
require:
- ts-node/register
- tsconfig-paths/register为什么我需要它
根据Clean ,“业务规则不能依赖于任何东西,它必须是可测试的”。但是,即使业务规则不依赖于视图、控制器等,我们也无法测试视图、控制器等中是否存在错误。
当我在应用程序中修改业务逻辑时,依赖它的所有内容都将失效。假设在业务逻辑中的实体中,type User { name: string; age: number }已更改为用户{ fullName: string; age: string; }类型。所有这些都依赖于业务逻辑(视图、控制器、演示程序等)变得无效-我也需要纠正它根据业务逻辑更新。
// 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.
}
}然而,在大应用中,这种修正可能需要几天、几周甚至几个月。我们如何才能得到反馈,证明至少业务逻辑工作正常,而且我们的方法是正确的?
发布于 2020-05-05 01:28:46
对你来说,要求打字稿忽略类型是没有意义的。你所描述的类似于要求一个计算器来确认2+2= 5,只是暂时的,因为最终你会要求2+3=5,但这可能需要很长的时间。
问题中的假设是,number和string具有足够的兼容性,无论test2返回1还是"1",您的业务逻辑都是合理的。这不是真的:举个例子,1 + 1 == 2、"1" + 1 == "11"和"1" - 1 == 0。根据这些应用于您的情况,忽略类型可能允许您测试您的业务逻辑,或者可能给您对已损坏的系统的错误信心。我敢打赌,一般来说,数据类型作为您要验证的业务逻辑的一部分,--如果不是业务逻辑,数据模型算得上是什么?
相反,您所描述的是一种渐进式迁移,在此期间,业务规则确保test2返回string | number。通过准确地描述类型系统中的迁移,您可能能够确认业务逻辑应用正确--如果在迁移过程中是这样的话--还可以提供一种类型,您只能从某些模块和调用站点中应用该类型,这些模块和调用站点可以在完成迁移时得到加强。
发布于 2020-05-06 08:51:39
type User = {
ID: number;
fullName: string;
age: string | number
}您可以指定这两种类型,以使迁移更容易,而不是在任何地方都使用//@ts-ignore。
这将在任何地方增加适当的建议,例如:

https://stackoverflow.com/questions/61553461
复制相似问题