Похоже, вы пытаетесь построить что-то вроде:
type StringOrNumber<T extends boolean> = T extends true ? string : number
Но это не будет использоваться при анализе потока. Таким образом, в блоке if
вы не получите ввод правильного типа.
function makeUsername<T extends boolean>({ data, userExists }: { data: StringOrNumber<T>; userExists: T }): any {
if (userExists) {
// But data here is still StringOrNumber<T>. You have to cast it manually.
const dataStr = data as string;
} else {
const dataNum = data as number;
}
}
// While on call side it works well
makeUsername({data: '12', userExists: true}) // ok
makeUsername({data: 12, userExists: true}) // 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