带引号或数字的类型的属性声明

时间:2018-03-30 09:42:45

标签: typescript

以下是有效的打字稿代码:

          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

是否有一个有效的用例,这样的事情会有意义?

2 个答案:

答案 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 | Fishbark()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';

对于只有一个有效值的属性的有效用例并不会产生任何想法。然而,在其他情况下 - 例如方法重载 - 只存在一个有效值的有效用例。