提出问题

在下面的测试代码中,编写的测试用例不需要用到所有的Item字段,如果用上完整的字段很没必要,不用又ts检测无法通过,这种情况怎么处理?

// type.ts

export interface Item {
 id: string;
 name: string;
 age: number;
 // ...其它n多个字段
}
// utils.ts

export const filterData = (data: Item[]) => {
  // ...
}
// utils.test.ts

it('should be equal', () => {
  const data = [
    {
        id: '1',
        name: 'tomcat',
    }
  ];

  // 这里ts会报错说data不是一个合法的Item[]
  expect(filterData(data)).toEqual([
    {
      id: '1',
      name: 'tomcat',
    }
  ]);

分析问题

问题的关键在于,让ts认为你提供的是完整的Item,而ts中的断言就是干这个的。

解决问题

// utils.test.ts

it('should be equal', () => {
  const data = [
    {
        id: '1',
        name: 'tomcat',
    }
  ] as Item[];
 // 上面的语法告诉ts,data是完整的Item

  // 这里ts会报错说data不是一个合法的Item[]
  expect(filterData(data)).toEqual([
    {
      id: '1',
      name: 'tomcat',
    }
  ]);

总结问题

该问题属于ts断言非常合理的使用场景。而断言的意图就是告诉ts,我掌握的信息比你(ts)多,相信我,我会处理好。


热饭班长
3.7k 声望434 粉丝

先去做,做出一坨狗屎,再改进。