字符串文字的语义作为数据类型

时间:2017-08-22 00:07:43

标签: typescript types

此摘录来自lib.es2015.symbol.wellknown.d.ts

interface Promise<T> {
    readonly [Symbol.toStringTag]: "Promise";
}

readonly的含义是不言而喻的,[Symbol.toStringTag]可能意味着“名为toString的函数属性”。

让我感到困惑的是使用字符串文字作为类型。我不认为这与

具有相同的含义
readonly [Symbol.toStringTag]: string = "Promise";

或者他们会这样写。那么字符串文字作为一种类型的含义是什么,以及运行时含义是什么?

2 个答案:

答案 0 :(得分:2)

首先,进行一次小修正:[ Symbol.toStringTag ]不是函数,而是由默认toString()函数检查的Symbol - 命名属性。我们的想法是,符合Promise接口的内容通常会在字符串描述中包含字符串"Promise"

这个问题的最佳答案可能是Advanced Types: String Literal Types下的TypeScript手册。

如果变量的类型是字符串,数字或布尔文字,则表示该变量只能 该值:

const yes: 'foo' = 'foo'; // okay
const no: 'foo' = 'bar'; // error, 'bar' is not assignable to 'foo'

这有几个用途:

  • 文字的联合可以表示允许值的枚举。 (例如,type ShirtSize = 'S'|'M'|'L'|'XL'type starRating = 1|2|3|4|5
  • 字符串文字可用于表示属性键。 (例如,Record<'foo'|'bar',number>基本上等同于{foo: number; bar: number}
  • 字符串文字可用作区分类型的标签:(例如,type Dog = {type: 'dog', bark():void}; type Cat = {type: 'cat', meow():void}; declare let animal: Dog | Cat; if (animal.type === 'dog') animal.bark(); else animal.meow();
  • 以及更多..查看上面列出的文档以获取更多信息

请注意:TypeScript的类型系统不会发送到JavaScript中。这意味着你会发现自己会重复文字:一次作为一种类型,一次作为一种价值:

const foo: 'foo' = 'foo';

第一个'foo'是类型,第二个是值。如果你不加价值,

const foo: 'foo';

然后你在运行时有一个未定义的值,这很糟糕。

希望有所帮助;祝你好运!

答案 1 :(得分:1)

简答

  

让我感到困惑的是使用字符串文字作为类型。

字符串文字类型约束所有[Symbol.toStringTag]实现,以将class MyPromise1<T> implements Promise<T> { public readonly [Symbol.toStringTag] = "Promise"; // Allowed public then = () => null; public catch = () => null; } class MyPromise2<T> implements Promise<T> { public readonly [Symbol.toStringTag] = "Foobar"; // Error! public then = () => null; public catch = () => null; } interface SomeThing<T> { readonly [Symbol.toStringTag]: "Promise" | "Foobar"; } class MySomeThing1<T> implements SomeThing<T> { public readonly [Symbol.toStringTag] = "Promise"; // Allowed } class MySomeThing2<T> implements SomeThing<T> { public readonly [Symbol.toStringTag] = "Foobar"; // Allowed } class MySomeThing3<T> implements SomeThing<T> { public readonly [Symbol.toStringTag] = "Foobaz"; // Error! } interface OtherThing<T> { readonly [Symbol.toStringTag]: string; } class MyOtherThing<T> implements OtherThing<T> { public readonly [Symbol.toStringTag] = "Any string is..."; // Allowed } 的值设置为字符串&#34; Promise&#34;。

长例

{{1}}