What about just this,
function getItems<T extends "circle" | "square">(type: T) { return shapes.filter(s => s.type == type) as ((Circle | Square) & {type: T})[]; }