2016-05-27 2 views
2

УчитываяКак расширить строковый литерал?

export type Foo = 'foo' | 'bar; 

Как продлить тип Foo (в другом модуле) также позволяет 'x' | 'y' как возможное значение?

Если я пишу где-то еще:

export type Foo = 'x' | 'y' 

Машинопись жалуется на дублированный идентификатор Foo.

ответ

2

От Спецификации машинописи Языка:

Интерфейса может иметь несколько объединенных декларации, а тип псевдоним для типа объекта буквального не может.

К сожалению, вы не можете расширить тип.

2

Вы не можете переопределить существующий тип Foo. Причиной этого является то, что существующий код может зависеть от Foo от только'foo' или 'bar'. В приведенном ниже примере, тип проверки не только делает вывод, что a не может быть в else блоке 'foo', можно сделать вывод, что a определенно 'bar' там:

type Foo = 'foo' | 'bar'; 
function test(x: Foo) { 
    if (x === 'foo') { 
     // infers x === 'foo' 
    } else { 
     // infers x === 'bar' 
    } 
} 

Однако, вы можете создать новый тип псевдонима, который принимает все значения Foo, а также некоторые другие:

type Foo = 'foo' | 'bar'; 
type FooEx = Foo | 'x' | 'y'; 

var a : FooEx; 
a = 'foo'; // ok 
a = 'x'; // ok 
a = 'z'; // error 
+0

Ну, но может быть код, который имеет расширение, которое расширяет допустимые типы букв. Предположим, вы используете типы строковых литералов для событий, тогда могут быть расширения, которые добавляют новые события в систему. Я думаю, предположение, которое не нужно ограничивать, что существующий код * только * зависит от '' foo' 'или '' bar'' ... –

Смежные вопросы