Open
Description
openedon Jul 8, 2024
π 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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment