此摘录来自lib.es2015.symbol.wellknown.d.ts
interface Promise<T> {
readonly [Symbol.toStringTag]: "Promise";
}
readonly的含义是不言而喻的,[Symbol.toStringTag]
可能意味着“名为toString
的函数属性”。
让我感到困惑的是使用字符串文字作为类型。我不认为这与
具有相同的含义readonly [Symbol.toStringTag]: string = "Promise";
或者他们会这样写。那么字符串文字作为一种类型的含义是什么,以及运行时含义是什么?
答案 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}}