Switch - плохой подход, единственное оправдание использованию switch'a - это оптимизация на низком уровне (как правило при чтении и парсинге данных из потока и т.п.) в энтерпрайз switch противопоказан.
Если нет однозначности, что возвращать из функции - это плохой дизайн. Т.е. это значит, что функция выполняет более одной задачи, либо объекты неправильно типизированы. Такую ситуацию, как у вас можно разрулить например:

Код AS3:
private var typesTable:Object = { "foo": Foo, "bar": Bar };
private var callbacksTable:Object = { "foo": fooCallback, "bar": barCallback };
. . .
function fooCallback(value:Foo):void { . . . }
function barCallback(value:Bar):void { . . . }
function createFromDefinition(type:String):void
{
callbacksTable[type](new this.typesTable[type]());
}
Таким образом вы "красиво" потеряете один тип, при этом сохранив строгую типизацию.