问题代码示例:
type NonNullableArrItems = T extends (infer U)[] ? NonNullable[] : NonNullable;
function test(arr: T): NonNullableArrItems {
// implementation
}
const a = test([1, null, 2]); // NonNullableArrItems
const b = test('abc'); // NonNullableArrItems
解决方法是使用类型分布法(distributive conditional types)指定数组元素的非空约束条件。在类型分布法的情况下,如果有联合类型时,将类型逐个拆分并组合,以处理每个类型。使用infer关键字来推断数组元素的类型。最后,将推断出的类型数组转换为非空类型数组。以下是解决方法的代码示例:
type NonNullableArrItems = T extends (infer U)[] ? { [K in keyof U]: NonNullable } : NonNullable;
function test(arr: T): NonNullableArrItems {
// implementation
}
const a = test([1, null, 2]); // NonNullableArrItems
const b = test('abc'); // NonNullableArrItems