用另一种方式表达
如何在windowState中键入TypeScript DOM属性?
解决了(在TypeScript 2中)
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
type Weather = 'sunny' | 'bad'我的一个想法是使用JavaScript 2015 Symbol,然而TypeScript似乎不知道这些。
另一个想法是使用enum,但是TypeScript抱怨说是member initializer must be constant expression
const enum Weather {
sunny = 'sunny',
bad = 'bad',
windy = Symbol('windy')
}我认为string常数是一个常量表达式。
发布于 2016-10-11 23:34:39
TypeScript 2.0支持受歧视的联合/代数数据类型。文档是这里。
您可以将字符串文本类型、联合类型、类型保护和类型别名组合起来,以构建一个名为区分联合的高级模式,也称为标记的联合或代数数据类型。受歧视的联合在函数式程序设计中很有用。有些语言为您自动区分联合;TypeScript构建在JavaScript模式的基础上,因为它们现在已经存在。有三种成分:
让我们开始:
interface Square {
kind: "square";
size: number;
}
interface Rectangle {
kind: "rectangle";
width: number;
height: number;
}
interface Circle {
kind: "circle";
radius: number;
}首先,我们声明我们将合并的接口。每个接口都有一个具有不同字符串文本类型的
kind属性。kind属性称为判别符或标记。其他属性特定于每个接口。注意,这些接口目前是不相关的。让我们把他们联合起来:
type Shape = Square | Rectangle | Circle;现在让我们使用受歧视的工会:
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将出错。
发布于 2015-11-25 11:50:37
要使用枚举,你可以写一些像这样的东西
enum Weather {
Sunny,
Windy
};
let currently = Weather.Sunny;字符串文字
OP要求解决这一问题的另一种方式是到达TypeScript 1.8。
他们会允许你这样做:
type Weather = 'Sunny' | 'Windy';https://stackoverflow.com/questions/33915459
复制相似问题