探索未知~
Typescript支持与Javascript几乎相同的数据类型,此外还提供使用的枚举类型方便我们使用。
最简单的数据类型就是true/false,在Javascript和Typescript里叫做boolean。
let isDone: boolean = false;
最简单的数据类型就是true/false,在Javascript和Typescript里叫做boolean。和Javascript一样,typescript里的所有数字都是浮点数。这些浮点数的类型是number。除了支持十进制和十六进制字面量,Typescript还支持ECMAScript2015中引入的二进制和八进制字面量。
let decLiteral: number = 6;
let hexLiteral: number = 0xf00d;
Javascript程序的另一项基本操作是处理网页或服务端的文本数据。像其他语言一样,我们使用string表示文本数据类型。和Javascript一样,可以使用双引号(")或单引号(')表示字符串
let name:string = "bob"
还可以使用“模板字符串”,他可以定义多行文本和内嵌表达式。这种字符串被反引号( `)并且以${expr}这种形式嵌入表达式
let name: string = `Gene`
let age: number=37;
let sentence: string= `Hello,my name is ${name}.
I'll be ${age+1} years old next month.`
与下面定义sentence的方式效果相同:
let sentence: string = "Hello,my name is"+ name + '.\n\n' +
"I'll be "+(age+1)+" years old next month.";
Typescript像Javascript一样可以操作数组元素。有两种方式可以定义数组,第一种,可以在数组类型后边接上[],表示由此类型元素组成的一个数组:
let list: number[]=[1,2,3];
第二种方式是使用数组泛型,Array<元素类型>:
let list: Array<number> = [1,2,3];
元祖类型允许表示一个已知元素数量和类型的数组,各元素的类型不必相同。
let x:[string, number];
x=['hello',10];
x=[10,'hello']; // error
当访问一个已知索引的元素,会得到正确的类型:
console.log(x[0].substr(1));
<!--console.log(x[1].substr(1)); // Error,'number' does not have 'substr'
当访问一个越界的元素,会使用联合类型替代:
x[3] = world; // OK,字符串可以赋值给(string|number)类型
console.log(x[5].toString()); // OK,'string'和''number'都有toString
x[6] = true; // Error, 布尔不是(string | number )类型
联合类型是高级主题,后续还会讨论
enum类型是对Javascript类型的补充,像C#等其他语言一样,使用枚举类型可以为一组数值赋予友好的名字。
enum Color {Red, Green, Blue}
let c: Color = Color.Green
默认情况下,从0开始为元素编号。也可以手动的指定成员的数值。如下:
enum Color {Red = 1, Green, Blue}
let c: Color = Color.Green
或者全部采用手动赋值
enum Color {Red=1, Green=2, Blue=4}
let c: Color = Color.Green;
枚举类型提供的一个便利是可以由枚举的值得到他的名字:
enum Color {Red=1, Green, Blue}
let colorName: string = Color[2];
console.log(colorName); // Green
有时候我们不清楚数据的类型,比如来自用户输入或来第三方代码库。这时候我们可以使用any
let notSure: any =4;
notSure = 'maybe a string instead';
notSure = false;
同时any类型还允许在它上面调用任何方法,相比Object更灵活:
let notSure: any =1;
notSure.ifItExists();
notSure.tofixed();
let prettySure: Object =4;
prettySure.toFixed(); //Error: Property 'tiFixed' doesn't exist on type 'Object'
当你只知道一部分数据的类型时,any也是有用的,比如一个数组,它包含了不同的类型的数据:
let list: any[] = [1, true, 'free'];
list[1] = 100;
某种程度上说,void类型像是与any类型相反,它表示没有任何类型。当一个函数没有返回值时,你通常会见到返回值类型是void:
function warnUser():void{
console.log("Thisis my warning message");
}
声明一个void类型的变量没有什么大用,因为你只能为它赋予undefind和null:
let unusable :void = undefined;
Typescript里,undefined和null两者个自有自己的类型分别叫做undefined和null。和void类似,他们本身的类型用处不是很大:
let u: undefined = undefined;
let n: null = null;
使用联合类型 string | null | undefined ,可以做很好的类型校验。
never类型表示的是那些永不存在的值的类型。例如,never类型是那些总是会抛出错误或者根本就不会有返回值的函数表达式或箭头表达式的返回值类型。变量也可能是never类型,当他们被永不为真的类型保护所约束时。never 是任何类型的子类型,也可以赋值给任何类型。然而,没有类型可以赋值给never类型,即使any也不能赋值给never。
<!--返回never的函数必须存在无法达到的终点-->
function error(message: string): never{
throw new Error(message)
}
function infiniteLoo(): never{
while(true){
}
}
object是非原始类型。
declare function create(o:object | null):void
create({prop:0}); // ok
create(42); // Error
类型断言好比其他语言的类型转换,但是不进行特殊的数据检查和解构。他没有运行时的影响,只在编译阶段起作用。 类型断言有两种语法,一种是尖括号语法:
let somenValue :any = "this is atring ";
let stringLength : number = (<string>someValue).length;
另一种是as语法:
let someValue : any = "this is string";
let sringLength :number = (someValue as string).length;
两种语法是等价的,但是在Typescript里面使用JSX时,只有as语法断言是允许的。
愿我们有能力不向生活缴械投降---Lin