以下是有效的打字稿代码:
A B C
2 01:00:00 17 Emma
7 02:00:00 14 Fred
请注意class Greeter {
one: 'Daniel';
two: 123.45;
greet() {
return `Hello ${this.one} ${this.two}`;
}
}
和one
属性上的冒号而不是等号。
这似乎是有效的代码,IDE告诉我two
的类型为one
,而'Daniel'
的类型为two
。
是否有一个有效的用例,这样的事情会有意义?
答案 0 :(得分:1)
简而言之:请注意,您的代码实际上会在ERROR o.h.e.jdbc.spi.SqlExceptionHelper - Duplicate entry 'toto@gmail.com' for key 'AK_EMAIL'
模式下或在设置--strictPropertyInitialization
compiler flag时向TypeScript v2.7及更高版本发出警告。这个想法是两个属性既没有初始化也没有在构造函数中设置,这可能是一个错误。
具有单个文字值的接口或类的大用例是discriminated union。假设你有一个单字面类型的属性接口,如
--strict
然后你可以打开该属性来缩小一个对象,该对象的类型是这些接口的联合的未知成员,只是其中一个。也就是说,您可以打开interface Dog {
kind: "dog";
bark();
}
interface Cat {
kind: "cat";
meow();
}
interface Fish {
kind: "fish";
swim();
}
属性,将kind
类型的对象缩小到可以安全地调用Dog | Cat | Fish
,bark()
或meow()
的对象。
同样,当您将通用类缩小为更具体的子类时。像这样:
swim()
最后,有些JavaScript对象需要以这种方式输入。如果你看一下Symbol.toStringTag
,你会发现在ES2015中,一些内置的JavaScript对象(或由内置的JavaScript构造函数构造的对象)具有该属性的众所周知的常量字符串值。因此TypeScript libraries for them具有单值 - 文字属性,例如:
class GreetAnybody {
one: string = "default";
two: number = 0;
greet() {
return `Hello ${this.one} ${this.two}`;
}
}
class GreetOnlyDaniel extends GreetAnybody {
one: 'Daniel' = 'Daniel';
two: 123.45 = 123.45;
}
无论如何,希望有所帮助。祝你好运。
答案 1 :(得分:-1)
根据jonrsharpe' comment,这些是"字符串文字类型"和"数字文字类型"。
在这个问题的情况下,这些类型将允许值的数量减少到指定值:
对于one
,仅允许值'Daniel'
对于two
,仅允许值123.45
。
这是一种特殊情况,因为在此示例中只允许一个值。通常,允许多个值,如下所示:
one: 'Daniel' | 'Patrick';
对于只有一个有效值的属性的有效用例并不会产生任何想法。然而,在其他情况下 - 例如方法重载 - 只存在一个有效值的有效用例。