Подписи нескольких типов для членов, типы соединений в TypeScript

Если у меня есть свойство, которое может быть строкой или логическим, как это определить:

interface Foo{
    bar:string;
    bar:boolean;
}

Я не хочу прибегать к:

interface Foo{
    bar:any;
}

Я не думаю, что это возможно без any. Вы можете ответить на любой из этих вопросов:

Я пропустил спецификацию и ее возможности прямо сейчас? Планируется ли что-то подобное? Был зарегистрирован запрос функции: http://typescript.codeplex.com/workitem/list/basic? (ОБНОВЛЕНИЕ это отчет о проблеме, на который вы можете проголосовать https://typescript.codeplex.com/workitem/1364)

Я бы предположил что-то вроде этого:

interface Foo{
    bar:string;
    bar:boolean;
    bar:any; 
}

var x:Foo = <any>{};
x.bar="asdf";
x.bar.toUpperCase(); // intellisence only for string 

Ответ 1

Это обычно называют "типами профсоюзов". Система типа TypeScript от 1.4 позволяет это сделать.

Смотрите: Расширенные типы

Ответ 2

По состоянию на 2015 год работают профсоюзные типы:

interface Foo{
    bar:string|boolean;
}

Ответ 3

Не сказать, что это отвечает на ваш вопрос, но можете ли вы прибегнуть к чему-то подобному?

interface Foo<T>{
    bar:T;
}

function createFoo<T>(bar:T) : Foo<T>{
    return {bar:bar};
}

var sFoo = createFoo("s");
var len = sFoo.bar.length;

var bFoo = createFoo(true);
var result = bFoo.bar === true;