基于typescript中参数值的条件类型函数

基于typescript中参数值的条件类型函数,typescript,Typescript,我正试图用faker软件包为我的Typescript模型建立一个工厂。我已经设法创建了一个功能性的通用工厂,比如临时包api,它接收一个通用模型生成器和一个覆盖所创建模型的选项。通用工厂生成模型工厂,所以它是生成工厂的工厂。生成的工厂可以接收两个参数,第一个参数是我要制作的模型数量,默认值为1,第二个参数是我要在模型上覆盖的选项。我的问题是,我不知道是否可以根据数量值自动有条件地确定工厂的退货类型,例如,如果数量为1,我应该返回IModel,但如果数量大于1,我应该返回IModel[] 现在我已

我正试图用faker软件包为我的Typescript模型建立一个工厂。我已经设法创建了一个功能性的通用工厂,比如临时包api,它接收一个通用模型生成器和一个覆盖所创建模型的选项。通用工厂生成模型工厂,所以它是生成工厂的工厂。生成的工厂可以接收两个参数,第一个参数是我要制作的模型数量,默认值为1,第二个参数是我要在模型上覆盖的选项。我的问题是,我不知道是否可以根据数量值自动有条件地确定工厂的退货类型,例如,如果数量为1,我应该返回
IModel
,但如果数量大于1,我应该返回
IModel[]

现在我已经显式返回了
IModel | IModel[]
,每当我使用工厂时,我都必须像这样键入返回:

jest.spyOn(registerUserStub,'execute').mockResolvedValueOnce(用户工厂(1)作为IUserModel)
我的代码:

//我的用户模型
导出类型IUserModel={
id:string,
名称:string,
电子邮件:string,
密码:string,
活动:布尔,
已确认:布尔值
}
工厂制造商

从“实用程序类型”导入{DeepPartial}
导出函数factoryMaker(objMaker:(选项?:DeepPartial)=>T:(数量:数量,选项?:DeepPartial)=>T | T[]{
退货(数量、选项)=>{
const entitiesArray=新数组(数量).fill(空).map(()=>objMaker(选项))
返回数量===1?entitiesArray[0]:entitiesArray
}
}
我的用户工厂


从“实用程序类型”导入{DeepPartial}
从“伪造者”导入伪造者
从“../models”导入{IUserModel}
从“./factoryMaker”导入{factoryMaker}
类型选项type=DeepPartial
函数makeUser(选项?:选项类型):IUserModel{
返回{
id:faker.random.uuid(),
密码:faker.random.uuid(),
电子邮件:faker.internet.email(),
名称:faker.name.findName(),
已确认:选项。已确认!==未定义?选项。已确认:真,
主动:对,
…选项
}
}
const userFactory=factoryMaker(makeUser)
导出{userFactory}

您可以让
factoryMaker
返回
N扩展1?T:T[]
,其中
N
是数量:

export function factoryMaker<T = any>(
  objMaker: (options?: DeepPartial<T>) => T
): <N extends number>(
  quantity: N,
  options?: DeepPartial<T>
) => N extends 1 ? T : T[] {
  return <N extends number>(
    quantity: N,
    options?: DeepPartial<T>
  ): N extends 1 ? T : T[] => {
    const entitiesArray = new Array(quantity).fill(null).map(() => objMaker(options))
    return (quantity === 1 ? entitiesArray[0] : entitiesArray) as N extends 1 ? T : T[]
  }
}

// ...

// IUserModel
const oneUser = userFactory(1)

// IUserModel[]
const twoUsers = userFactory(2)

// IUserModel | IUserModel[]
const oneOrTwoUsers = userFactory(Math.random() > 0.5 ? 1 : 2)
导出函数factoryMaker(
objMaker:(选项?:DeepPartial)=>T
): (
数量:N,
选项?:DeepPartial
)=>N扩展1?T:T[]{
返回(
数量:N,
选项?:DeepPartial
):N扩展1?T:T[]=>{
const entitiesArray=新数组(数量).fill(空).map(()=>objMaker(选项))
返回(数量===1?entitiesArray[0]:entitiesArray)作为N扩展1?T:T[]
}
}
// ...
//IUSER模型
const oneUser=userFactory(1)
//IUserModel[]
const twoosers=userFactory(2)
//IUserModel | IUserModel[]
const oneortwowers=userFactory(Math.random()>0.5?1:2)

嘿,谢谢,这很有帮助。在发布之前,我试着查看文档中的有条件键入,但我发现
扩展的语法很难理解。但我很清楚你的回答。:)