使用Typescript泛型的显式值类型约束?

时间:2019-03-05 23:36:27

标签: typescript

我有这个功能:

function filterByCourseNumber(data: IPost[] | IExam[], courses: string[]) {
  if (courses.length === 0) return data;
  return data.filter((item) => _includes(courses, item.courseNumber));
}

当我通过IPost[]时,效果很好,但是当我这样做时:

exams = filterByCourseNumber(exams, filters.courses)

我遇到此错误:

Type 'IPost[]' is not assignable to type 'IExam[]'.
  Type 'IPost' is not assignable to type 'IExam'.
    Types of property 'claimer' are incompatible.
      Type 'string | undefined' is not assignable to type 'string'.
        Type 'undefined' is not assignable to type 'string'.ts(2322)
let exams: IExam[]

我知道我需要使用泛型,但是我不知道如何编写接口。

我尝试过:

function filterByCourseNumber<T>(data: T[], courses: string[]): T[] {
  if (courses.length === 0) return data;
  return data.filter((item) => _includes(courses, item.courseNumber));
}

但是item.courseNumber出现错误:

Property 'courseNumber' does not exist on type 'T'.

我想我已经接近了,但是我不确定如何使我的函数知道T只能是IPostIExam

1 个答案:

答案 0 :(得分:1)

将类型参数限制为IPost | IExam类型。

function filterByCourseNumber<T extends IPost | IExam>(data: T[], courses: string[]): T[] {