TypeScript中的条件参数类型

TypeScript中的条件参数类型,typescript,generics,types,conditional-statements,Typescript,Generics,Types,Conditional Statements,这里有一个函数,其中第一个参数类型取决于第二个参数是true还是false 所以,如果userExists为true,则数据应该是字符串,否则是数字。但我一直看到错误 有人能帮我找出哪里出了问题吗 type DataType<T> = T extends boolean ? string : number const makeUsername = async <T extends boolean>({ data, userExists, }: { data:

这里有一个函数,其中第一个参数类型取决于第二个参数是true还是false

所以,如果userExists为true,则数据应该是字符串,否则是数字。但我一直看到错误

有人能帮我找出哪里出了问题吗

type DataType<T> = T extends boolean ? string : number

const makeUsername = async <T extends boolean>({
  data,
  userExists,
}: {
  data: DataType<T>,
  userExists: T
}) => {

  if (userExists) {
    // data type should be string
  } else {
    // data type should be number
  }
}
type DataType=T扩展布尔值?字符串:数字
const makeUsername=async({
数据,
用户存在,
}: {
数据:数据类型,
userExists:T
}) => {
如果(用户存在){
//数据类型应为字符串
}否则{
//数据类型应为数字
}
}

看起来,您正试图构建以下内容:

type StringOrNumber<T extends boolean> = T extends true ? string : number
但函数重载在这里可能更合适:

function makeUsername({ data, userExists }: { data: string; userExists: true }): any;
function makeUsername({ data, userExists }: { data: number; userExists: false }): any;
function makeUsername({ data, userExists }: { data: string | number; userExists: boolean }): any {     
  if (userExists) {
    // Here you have to cast types anyway...
    const dataStr = data as string;
  } else {
    const dataNum = data as number;
  }
}

// But on call side, this will also works as expected.
makeUsername({ data: 'kyo', userExists: true }) // ok
makeUsername({ data: 'kyo', userExists: false }); // error
function makeUsername({ data, userExists }: { data: string; userExists: true }): any;
function makeUsername({ data, userExists }: { data: number; userExists: false }): any;
function makeUsername({ data, userExists }: { data: string | number; userExists: boolean }): any {     
  if (userExists) {
    // Here you have to cast types anyway...
    const dataStr = data as string;
  } else {
    const dataNum = data as number;
  }
}

// But on call side, this will also works as expected.
makeUsername({ data: 'kyo', userExists: true }) // ok
makeUsername({ data: 'kyo', userExists: false }); // error