// 定义工具类型IfEquals,用于判断两个类型是否相等
// 如果A和B相等,返回X,否则返回Y
type IfEquals<A, B, X, Y> = (<T>() => T extends A? 1 : 2) extends (<T>() => T extends B? 1 : 2)? X : Y;
// 定义泛型函数filterByType
// T为数组元素可能的类型联合,K为类型标识
function filterByType<T, K extends keyof { [P in T as `${P}`]: P }>(
arr: T[],
type: K
): IfEquals<K, 'number', number[], IfEquals<K,'string', string[], never>> {
// 如果类型标识是'number'
if (type === 'number') {
return arr.filter((item): item is number => typeof item === 'number') as IfEquals<K, 'number', number[], IfEquals<K,'string', string[], never>>;
}
// 如果类型标识是'string'
else if (type ==='string') {
return arr.filter((item): item is string => typeof item ==='string') as IfEquals<K, 'number', number[], IfEquals<K,'string', string[], never>>;
}
// 其他情况返回空数组(这里实际类型是never,只是示例需要返回空数组)
return [] as IfEquals<K, 'number', number[], IfEquals<K,'string', string[], never>>;
}