如何扩展字符串文字类型?

时间:2016-05-27 21:21:42

标签: typescript

鉴于

export type Foo = 'foo' | 'bar;

如何扩展类型Foo(在另一个模块中)以允许'x' | 'y'作为可能的值?

如果我在其他地方写作:

export type Foo = 'x' | 'y'

Typescript抱怨重复的标识符Foo

3 个答案:

答案 0 :(得分:4)

您无法覆盖现有的Foo类型。这样做的原因是现有代码可能仅依赖于Foo 'foo''bar'。在下面的示例中,类型检查器不仅推断a块中'foo'不能else,还可以推断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

答案 1 :(得分:2)

从TypeScript语言规范:

  

接口可以有多个合并声明,但对象类型文字的类型别名不能。

不幸的是,你无法扩展类型。

答案 2 :(得分:1)

如果它在单独的文件中,则只需在导入目标文件时将原始foo重命名为其他名称即可。

original.ts

export type Foo = 'foo' | 'bar';

target.ts

import { Foo as OriginalFoo } from './original';

export type Foo = OriginalFoo | 'x' | 'y';

现在,如果您使用target.ts文件中的Foo定义,则应允许'foo'或'bar'或'x'或'y'