数据类型:
布尔值,数字,字符串,数组,
eg:let a: number = 1
let arr: Array<number> = [1, 2, 3]
元组 Tuple:已知数组元素个数和类型的数组
eg: let arr: [string, number] = ['hello', 2] // true
let arr: [string, number] = [1, 'ddd'] //false
注:在访问已知类型的数组元素时,可以调用其拥有的方法,若该类型没有该方法会报错
当访问一个越界数组元素时,会使用联合类型代替(arr[3] = 'aaa' // true,arr[3]的类型为 number|string)
枚举
eg: enum Color {Red, Green, Blue}; let c: Color = Color.Green;
默认情况下从0开始为元素编号,但是也可以自己定义
enum Color {Red = 1, Green, Blue};let c: Color = Color.Green;
注:枚举类型可以通过值得到它的名字
eg: enum Color {Red = 1, Green, Blue}; let colorName: string = Color[2]; alert(colorName); // 显示'Green'因为上面代码里它的值是2
任意值:不清楚该值类型时
eg:let a: any = 1
let arr: any[] = [1, 'dad']
空值:表示没有任何类型
eg:function fn(): void{没有返回值}
let a: void = undefined | null(当给一个变量指定为void类型时,只能给它赋值为null或undefined)
null和undefined:在typescript中,null和undefined都有自己的类型:null和undefined,他们时任何类型的子类型
never:表示永不存在的值的类型,例如会抛出异常或根本就不会有返回值的函数表达式或箭头函数表达式的返回值类型
eg:
// 返回never的函数必须存在无法达到的终点
function error(message: string): never {
throw new Error(message);
}
// 推断的返回值类型为never
function fail() {
return error("Something failed");
}
// 返回never的函数必须存在无法达到的终点
function infiniteLoop(): never {
while (true) {
}
}
变量声明:
let,const,var(同ES6)
解构:
数组解构:
let input = [1, 2];
let [first, second] = input;
console.log(first); // outputs 1
console.log(second); // outputs 2
对象解构:
let o = {
a: "foo",
b: 12,
c: "bar"
};
let { a, b } = o;
({ a, b } = { a: "baz", b: 101 }); // 注意要用()扩起来,因为js通常会将{起始的地方解释为一个块
let {a, b}: {a: string, b: number} = o; // 指示类型
接口:
interface LabelledValue {
label: string;
}
function printLabel(labelledObj: LabelledValue) {
console.log(labelledObj.label);
}
let myObj = {size: 10, label: "Size 10 Object"};
printLabel(myObj);
可选属性:
interface SquareConfig {
color?: string;
width?: number;
}
function createSquare(config: SquareConfig): {color: string; area: number} {
let newSquare = {color: "white", area: 100};
if (config.color) {
newSquare.color = config.color;
}
if (config.width) {
newSquare.area = config.width * config.width;
}
return newSquare;
}
let mySquare = createSquare({color: "black"});
可选属性的优点:1. 可以对属性进行预定义
2. 可以捕获用了不存在属性时的错误(会报没有该属性的错误)
只读属性:
interface Point {
readonly x: number;
readonly y: number;
}
let p1: Point = { x: 10, y: 20 };
p1.x = 5; // error!
函数类型:接口也可以描述函数类型
仅需定义参数列表和返回值类型
interface SearchFunc {
(source: string, subString: string): boolean;
}
let mySearch: SearchFunc;
mySearch = function(source: string, subString: string) {
let result = source.search(subString);
return result > -1;
} // 函数参数和接口定义属性名可以不同