特定
export type Foo = 'foo' | 'bar;
如何扩展类型Foo
(在另一个模块中)也允许'x' | 'y'
作为可能的值?
如果我写在其他地方:
export type Foo = 'x' | 'y'
打字稿抱怨重复的标识符Foo
。
如果它位于单独的文件中,您只需在导入目标文件期间将原始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'
您无法覆盖现有的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
从TypeScript语言规范:
接口可以有多个合并声明,但对象类型文字的类型别名不能。
不幸的是,你无法扩展类型。