如何在Typescript中测试泛型类型?不是泛型类型的实现,而是作为typeguard?
作为一个个人的“我真的理解typescript吗?”项目,我正在将一堆typescript类型扩展到实用程序库中 我只是在弄清楚如何对这该死的东西进行单元测试时遇到了很多麻烦 问题是,我想测试,当我将错误的类型传递给调用类型的函数时,TSC是否会捕获它。确实如此。精彩绝伦但是有一个小小的缺陷,我使用的单元测试库(Jest)会抛出一个错误(期望的行为),然后拒绝运行测试套件的其余部分,因为它抛出了一个错误。我甚至不能使用“will throw error”,因为这不是Javascript错误,而是Typescript错误 这是我到目前为止的代码。我正在使用Jest,但我的解决方案不需要是特定于Jest的,我有一种有趣的感觉,我可能需要某种专门的测试库如何在Typescript中测试泛型类型?不是泛型类型的实现,而是作为typeguard?,typescript,unit-testing,typescript-generics,Typescript,Unit Testing,Typescript Generics,作为一个个人的“我真的理解typescript吗?”项目,我正在将一堆typescript类型扩展到实用程序库中 我只是在弄清楚如何对这该死的东西进行单元测试时遇到了很多麻烦 问题是,我想测试,当我将错误的类型传递给调用类型的函数时,TSC是否会捕获它。确实如此。精彩绝伦但是有一个小小的缺陷,我使用的单元测试库(Jest)会抛出一个错误(期望的行为),然后拒绝运行测试套件的其余部分,因为它抛出了一个错误。我甚至不能使用“will throw error”,因为这不是Javascript错误,而是
//src/other/other.ts
导出类型或=(基本和或)|(基本和或);
//src/other/other.spec.ts
从“/earth”导入{earth};
界面Pet{
名称:字符串;
}
接口狗{
说:“awoo”|“ruff”|“yip”|“bork”|“bark”|“grr”;
威尔费奇:对;
}
接口猫{
说:“喵”|“嘶嘶”;
willFetch:假;
}
描述(“任意一个”,()=>{
它(“允许一个或另一个扩展,但不能同时允许两个,也不能同时允许两个”,()=>{
类型CommonPet=任一;
康斯特·瓦塔米=(宠物:普通宠物):“狗”|“猫”=>{
if(pet.willFetch==true){
返回“狗”;
}
返回“猫”;
};
expect(whatAmI({name:“Rex”,willFetch:true,says:“awoo”})).toBe(“dog”);
expect(whatAmI({name:“Psycho”,说:“hiss”,willFetch:false})).toBe(
“猫”
);
//这些行将抛出typescript错误(需要)
/*
const freak=whatAmI({name:“freak”,表示“喵”,willFetch:true});
const unmonpet=whatAmI({name:'Nagini',says:'hiss',willFetch:false,isSnake:true});
*/
//但是我如何告诉Jest我希望它抛出一个打字脚本错误呢?
接口AristoCat{
知道其位置:布尔值;
}
界面凝胶{
噩梦燃料:数量;
}
类型MusicalCat=其中之一;
const isGood=(cat:MusicalCat):布尔值| never=>{
如果(cat中的“知道它在哪里”){
返回true;
}
如果(类别噩梦燃油>0){
抛出新错误(“nooooo!”);
}
返回false;
};
期待(
很好({
姓名:“公爵夫人”,
说:“喵”,
威尔:错,
知道它在哪里:真的
})
).托比(对);
期待(
很好({
名称:“MacCaution(舞台)”,
威尔:错,
说:“喵”,
噩梦燃料:0
})
).toBe(假);
const filmIt=()=>
很好({
名称:“麦克腔”,
威尔:错,
说:“喵”,
噩梦燃料:9001
});
期望(filmIt).tothrowrormatchinginlinesnapshot(`nooooo!'`);
//同样,我们希望这会加入TYPESCRIPT,因为它同时具有这两种功能。
/*
const dreamIHadOnAcid=isGood({
姓名:“柴郡”,
说:“喵”,
威尔:错,
知道它在哪里:真的,
噩梦燃料:5/7
})
*/
//同样,我们希望它能加入TYPESCRIPT,因为它两者都没有。
/*
const dreamIHadOnAcid=isGood({
名称:“塔达尔沙司”,
说:“喵”,
威尔:错,
})
*/
});
});
--编辑:
还有一个额外的困难。在这种情况下,我不确定我的任何一种类型是否按它应该的方式工作(或者,如果是这样,编译器就无法提取它)
我正在用打字机做这个
export type Either<Base, Either, Or> = (Base & Either) | (Base & Or);
type Pet = {
name: string;
says?: string;
}
type DogExtension = {
playHours: number;
}
type CatExtension = {
sleepHours: number;
}
type CommonPet = Either<Pet, DogExtension, CatExtension>;
const dog: CommonPet = { name: "rex", says: "awoo", playHours: 5 };
const cat: CommonPet = { name: "manx", says: "meow", sleepHours: 14 };
const testPet = (testName: string, pet: CommonPet): CommonPet => {
return pet
};
testPet("dog should pass", dog);
testPet("cat should pass", cat);
testPet("catdog should not pass", { ...dog, ...cat }); /* should throw a type error, but doesn't */
导出类型或=(基本和或)|(基本和或);
Pet类型={
名称:字符串;
说?:字符串;
}
类型扩展={
游戏时间:数字;
}
类型CatExtension={
睡眠时间:数字;
}
类型CommonPet=任一;
康斯特狗:CommonPet={名字:“雷克斯”,说:“哇哦”,游戏时间:5};
const猫:CommonPet={name:“manx”,说:“喵”,睡眠时间:14};
常量testPet=(testName:string,pet:CommonPet):CommonPet=>{
归还宠物
};
测试宠物(“狗应该通过”,狗);
测试宠物(“猫应该通过”,猫);
testPet(“猫狗不应该通过”,{…狗,…猫});/*应该抛出类型错误,但不会*/
这可能是typescript编译器中的错误。。。而且制作起来很容易。狗是普通宠物,猫是普通宠物,那么为什么{…狗,{猫}不是普通宠物呢?除非-更可能的解决方案,否则我的other=(T&E)|(T&O)就不能像我想象的那样工作 我以前遇到过这个问题,并设法解决了它。我发现这些测试对于编写包含大量泛型类型逻辑的库非常有价值,因为我经常遇到这样的情况:修复一件事会导致在其他地方错误地推断类型 这是我设法让它工作的地方。具体来说,包含一个测试。可通过
纱线类型检查
或npm运行类型检查
进行型式试验
当某些操作失败时,您将得到如下错误:
Error: /good-form/types/Field.types.ts:19:3
ERROR: 19:3 expect TypeScript@local expected type to be:
number
got:
string
我和你一样,学打字。我有很多单元测试。这个库本身就是你想要实现的。因此,我建议您开始编写严格的
Equals
类型,以检查您的类型结果。我以前没有听说过您的打字测试。你确定这就是你想做的吗?测试通常用于实际运行代码,并确保代码按您认为的方式运行。但是你可以依靠编译器为你强制执行类型安全。是的,这正是我想要做的。此代码不适用于现有的代码库。基本上,我想做的是编译一个泛型类型列表(如上面的“要么”),并将它们作为实用程序类型导入NPM/Thread库。我们的想法是