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