首页 > 解决方案 > 带有打字稿泛型的显式值类型约束?

问题描述

我有这个功能:

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只能是IPostor IExam

标签: typescript

解决方案


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

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

推荐阅读