Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 如何扩展字符串文字类型?_Typescript - Fatal编程技术网

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

Typescript 如何扩展字符串文字类型?,typescript,Typescript,给定 如何扩展类型Foo(在另一个模块中)以允许'x'|'y'作为可能的值 如果我在其他地方写: export type Foo = 'foo' | 'bar; Typescript抱怨Typescript语言规范中的重复标识符Foo: 接口可以有多个合并声明,但对象类型文字的类型别名不能 很遗憾,您无法扩展类型。您无法覆盖现有的Foo类型。原因是现有代码可能依赖于Foo仅为'Foo'或'bar'。在下面的示例中,类型检查器不仅可以推断a不能是else块中的'foo',还可以推断a肯定是'ba

给定

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

如果我在其他地方写:

export type Foo = 'foo' | 'bar;

Typescript抱怨Typescript语言规范中的重复标识符
Foo

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


很遗憾,您无法扩展类型。

您无法覆盖现有的
Foo
类型。原因是现有代码可能依赖于
Foo
仅为
'Foo'
'bar'
。在下面的示例中,类型检查器不仅可以推断
a
不能是
else
块中的
'foo'
,还可以推断
a
肯定是
'bar'

export type Foo = 'x' | 'y'
但是,您可以创建一个新的类型别名,它接受
Foo
类型的所有值以及其他一些值:

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
target.ts

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

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

那么,可能有代码的扩展名扩展了允许的文本类型。假设您对事件使用字符串文字类型,那么可以有扩展向系统添加新事件。我认为,假设现有代码只依赖于
'foo
'或
'bar'
。。。
import { Foo as OriginalFoo } from './original';

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