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

使用typescript泛型的显式值类型约束?,typescript,Typescript,我有这个功能: function filterByCourseNumber(data: IPost[] | IExam[], courses: string[]) { if (courses.length === 0) return data; return data.filter((item) => _includes(courses, item.courseNumber)); } 当我传入IPost[]时,它工作正常,但当我传入时: exams = filterByCours

我有这个功能:

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));
}

我想我很接近,但我不确定如何让我的函数知道
T
只能是
IPost
IExam
将您的类型参数限制为
IPost | IExam
类型

function filterByCourseNumber<T extends IPost | IExam>(data: T[], courses: string[]): T[] {
函数过滤器bycoursenumber(数据:T[],课程:string[]):T[]{

如果您将所有代码都包含在示例中,这将非常有用。例如,
IPost
IExam
都缺失,因此我们不知道它们的属性,即使您在示例中使用了它们的属性。谢谢,我在文档中看到了这一点,但我不知道如何扩展联合。非常有意义:-)我不能你知道为什么我现在明白了,我希望我能帮上忙,但我没有使用ESLint,而且它看起来像是ESLint解析错误。你的代码是完全有效的TypeScript。
function filterByCourseNumber<T extends IPost | IExam>(data: T[], courses: string[]): T[] {