基础类型
TypeScript 中的基础类型
Number
跟
let decimal: number = 6;
let hex: number = 0xf00d;
let binary: number = 0b1010;
let octal: number = 0o744;
如果我们在代码中希望显式区分
type int = number;
type float = number;
布尔类型的值使用
let isDone: boolean = false;
所有的字符串类型使用
let fullName: string = `Bob Bobbington`;
let age: number = 37;
let sentence: string = `Hello, my name is ${fullName}.
I'll be ${age + 1} years old next month.`;
值得一提的是,就像
/* WRONG */
function reverse(s: String): String;
/* OK */
function reverse(s: string): string;
Enum | 枚举类型
类似于
enum StoryType {
Video,
Article,
Tutorial
}
let st: StoryType = StoryType.Article;
值得一提的是,枚举类型被转化为
const StoryType;
(function(StoryType) {
StoryType[(StoryType['Video'] = 0)] = 'Video';
StoryType[(StoryType['Article'] = 1)] = 'Article';
StoryType[(StoryType['Tutorial'] = 2)] = 'Tutorial';
})(StoryType || (StoryType = {}));
const st = StoryType.Article;
我们同样可以指定枚举值对应的数值:
enum StoryType {Video = 10, Article = 20, Tutorial=30}
从
enum Colors {
Red = "RED",
Green = "GREEN",
Blue = "BLUE"
}
Arrays & Tuple | 数组与元组
在
const tags: string[] = ["javascript", "programming"];
tags.push("typescript");
tags.forEach(function(tag) {
console.log(`Tag ${tag}`);
});
let storyLikedBy: Array<number> = [1, 2, 3];
我们也可以通过
interface StringArray {
[index: number]: string;
}
let myArray: StringArray;
myArray = ["Bob", "Fred"];
let myStr: string = myArray[0];
多维数组
多维数组的声明与初始化方式如下:
class Something {
private things: Thing[][];
constructor() {
things = [];
for (const i: number = 0; i < 10; i++) {
this.things[i] = [];
for (const j: number = 0; j < 10; j++) {
this.things[i][j] = new Thing();
}
}
}
}
从
interface Data extends Array<number> {
0: number;
1: number;
length: 2;
}
在很多情况下我们也需要去定义递归数组:
type Atom = string | boolean | number;
interface NestedArray extends Array<NestedArray | Atom> { }
type AtomOrArray = Atom | NestedArray;
// Usage
let foo: AtomOrArray = ["", 1, [1, 2, ""] ] let bar: AtomOrArray = ""
Tuple
let storyTitles = [
"Learning TypeScript",
"Getting started with TypeScript",
"Building your first app with TypeScript"
];
let titlesAndLengths: [string, number][] = storyTitles.map(function(title) {
let tuple: [string, number] = [title, title.length];
return tuple;
});
元组类型也可以通过
interface KeyValuePair extends Array<number | string> {
0: string;
1: number;
}
空类型/ 未知类型
Never
function fail(message: string): never {
throw new Error(message);
}
fail
函数时,若其为非
function foo(x: string | number): boolean {
if (typeof x === "string") {
return true;
} else if (typeof x === "number") {
return false;
}
return fail("Unexhaustive!");
}
let foo: unknown = 10;
// 因为 `foo` 是 `unknown` 类型, 所以这些地方会出错。
foo.y.prop;
foo.z.prop;
foo();
new foo();
upperCase(foo);
foo`hello world!`;
function upperCase(x: string) {
return x.toUpperCase();
}
这个时候,我们可以执行强制检查,或者使用类型断言。
let foo: unknown = 10;
function hasXYZ(obj: any): obj is { x: any; y: any; z: any } {
return (
!!obj && typeof obj === "object" && "x" in obj && "y" in obj && "z" in obj
);
}
// 使用用户定义的类型检查...
if (hasXYZ(foo)) {
// ... 现在可以访问它的属性。
foo.x.prop;
foo.y.prop;
foo.z.prop;
}
// 通过使用类型断言,我们告诉 TypeScript,我们知道自己在做什么。
upperCase(foo as string);
function upperCase(x: string) {
return x.toUpperCase();
}
any
let notSure: any = 4;
notSure = "maybe a string instead";
notSure = false; // okay, definitely a boolean