类型定义中的问号有什么作用?

What does the question mark in type definitions do?

我正在查看 Nest.js 类型定义,因为 Typescript 在我的参数中要求特定类型。

insert<TResult2 = number[]>(
  data: TRecord extends CompositeTableType<unknown>
    ? ResolveTableType<TRecord, 'insert'> | ReadonlyArray<ResolveTableType<TRecord, 'insert'>>
    : DbRecordArr<TRecord> | ReadonlyArray<DbRecordArr<TRecord>>
): QueryBuilder<TRecord, TResult2>;

在这个函数中,?CompositeTableType类型之后做了什么。我知道 | 栏指定需要使用 ResolveTableTypeReadonlyArray,但不知道如何与 ? 联系起来。

我制作的有问题的函数

async create(data: TTableAttributes extends any) // Put any because wasn't sure what to put after "extends CompositeTableType<TTableAttributes>"
{
    await this.knex.insert(data).returning("*").then((data) => { console.log(data); return data; });
}

这些称为条件类型。它只是一个常规的条件运算符(三元运算符?:) https://www.typescriptlang.org/docs/handbook/2/conditional-types.html

如果 TRecord 继承自 CompositeTableType,则“数据”参数的类型将为 ResolveTableType | ReadonlyArray>。否则,它将是类型 DbRecordArr | ReadonlyArray