Open
Description
π Search Terms
switch map array narrow
π Version & Regression Information
I went back to TS 4 - still present
β― Playground Link
π» Code
export type FilterParamValue = string | number | Date | string[];
export interface IFilter<T extends string> {
name: T;
params?: Record<string, FilterParamValue>;
}
export interface IBasicFilterSegment<T extends string> extends IFilter<T> {
type: 'filter';
}
export type IFilterSegment<T extends string> = IFilterSegmentExpression<T> | IBasicFilterSegment<T>;
export type SegmentOperator = 'and' | 'or';
export interface IFilterSegmentExpression<T extends string> {
type: SegmentOperator;
predicates: IFilterSegment<T>[];
}
enum FilterNames {
BarIs = 'bar_is',
BazIs = 'baz_is'
}
enum DimensionType {
Bar = 'bar',
Baz = 'baz'
}
export type IDimension = {
id: string;
type: DimensionType.Bar;
} | {
id: string;
label: string;
type: DimensionType.Baz;
};
const transform = (dimensions: IDimension[]): IFilterSegment<FilterNames> => {
return {
type: 'and',
predicates: dimensions.map(dimension => {
switch (dimension.type) {
case DimensionType.Bar: {
return {
type: 'filter',
name: FilterNames.BarIs,
params: {
barId: dimension.id
}
}
}
case DimensionType.Baz: {
return {
type: 'filter',
name: FilterNames.BazIs,
params: {
bazId: dimension.id
}
}
}
}
})
}
}
π Actual behavior
A compile-time error is displayed. It appears that the fact that we might return in the first switch case is "carried over" to the second one.
π Expected behavior
Type narrowing to work correctly as the mapping is correct. In fact, if one extracts this mapping to a separate function, the behaviour is fixed. Playground.
Additional information about the issue
No response