首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TypeScript中的代数数据类型

TypeScript中的代数数据类型
EN

Stack Overflow用户
提问于 2015-11-25 11:33:27
回答 2查看 12.3K关注 0票数 14

用另一种方式表达

如何在windowState中键入TypeScript DOM属性?

解决了(在TypeScript 2中)

代码语言:javascript
复制
declare var windowState: WindowState
const enum WindowState {
  STATE_MAXIMIZED = 1,
  STATE_MINIMIZED = 2,
  STATE_NORMAL = 3,
  STATE_FULLSCREEN = 4
}
...
var windowState = 5 // Type Error, as expected!

原始问题

如何在declare中使用type来描述代数数据类型?这样做的目的是描述现有的API。

当我尝试下面的内容时,TypeScript显然会抱怨type is expected

代码语言:javascript
复制
type Weather = 'sunny' | 'bad'

我的一个想法是使用JavaScript 2015 Symbol,然而TypeScript似乎不知道这些。

另一个想法是使用enum,但是TypeScript抱怨说是member initializer must be constant expression

代码语言:javascript
复制
const enum Weather {
  sunny = 'sunny',
  bad = 'bad',
  windy = Symbol('windy')
}

我认为string常数是一个常量表达式。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-11 23:34:39

TypeScript 2.0支持受歧视的联合/代数数据类型。文档是这里

您可以将字符串文本类型、联合类型、类型保护和类型别名组合起来,以构建一个名为区分联合的高级模式,也称为标记的联合或代数数据类型。受歧视的联合在函数式程序设计中很有用。有些语言为您自动区分联合;TypeScript构建在JavaScript模式的基础上,因为它们现在已经存在。有三种成分:

  1. 具有公共文字(或枚举)属性的类型--判别符。
  2. 接受这些类型的联合的类型别名--联合。
  3. 在公共属性上键入保护。

让我们开始:

代码语言:javascript
复制
interface Square {
    kind: "square";
    size: number;
}
interface Rectangle {
    kind: "rectangle";
    width: number;
    height: number;
}
interface Circle {
    kind: "circle";
    radius: number;
}

首先,我们声明我们将合并的接口。每个接口都有一个具有不同字符串文本类型的kind属性。kind属性称为判别符或标记。其他属性特定于每个接口。注意,这些接口目前是不相关的。让我们把他们联合起来:

代码语言:javascript
复制
type Shape = Square | Rectangle | Circle;

现在让我们使用受歧视的工会:

代码语言:javascript
复制
function area(s: Shape) {
    switch (s.kind) {
        case "square": return s.size * s.size;
        case "rectangle": return s.height * s.width;
        case "circle": return Math.PI * s.radius ** 2;
    }
}

在每个分支中,TypeScript将缩小类型。如果您尝试使用一个值不作为任何case属性出现的kind子句,那么TypeScript将出错。

票数 33
EN

Stack Overflow用户

发布于 2015-11-25 11:50:37

要使用枚举,你可以写一些像这样的东西

代码语言:javascript
复制
enum Weather {
    Sunny,
    Windy
};

let currently = Weather.Sunny;

字符串文字

OP要求解决这一问题的另一种方式是到达TypeScript 1.8

他们会允许你这样做:

代码语言:javascript
复制
type Weather = 'Sunny' | 'Windy';
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33915459

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档