js原有数据类型在ts中的应用
let isDone: boolean = false; let decLiteral: number = 6; let myName: string = 'Tom'; let u: undefined = undefined; let n: null = null;
undefined类型的变量只能被赋值为undefined,null只能被赋值为null
如果是一个普通类型,在赋值过程中改变类型是不被允许的,因此如果需要改变类型就需要用到any
et myFavoriteNumber: any = 'seven';
myFavoriteNumber = 7;
在任意值上访问任何属性都是允许的,也允许调用任何方法
let anyThing: any = 'hello';
console.log(anyThing.myName);
变量如果在声明的时候,未指定其类型,那么它就会被识别为任意值类型
ts存在类型推论,就是说在定义变量的时候,虽然没有指定变量的类型,但是定义了变量的具体值,就根据这个值来推断这个变量的类型,也就不可以再改变这个变量的类型了。同时支持联合类型,就是说取值可以是多种类型的一种,比如
let myFavoriteNumber: string | number;
当ts不确定一个联合类型具体是哪个类型的时候,我们就只能访问此联合类型的所有类型里共有的属性或方法
function getLength(something: string | number): number { return something.length; } //length 不是 string 和 number 的共有属性,所以会报错。
- 接口
interface Person { name: string; age: number; } let tom: Person = { name: 'Tom', age: 25 };
变量Tom的形状必须跟接口Person完全一致,属性也是不能多不能少,if你有不一致需求的时候
interface Person { name: string; age?: number; //允许这个变量没有 } let tom: Person = { name: 'Tom' };
这时仍然不允许添加未定义的属性,如果需要任意属性,使用[propName: string]就可以定义任意属性来取string类型的值。一旦定义了任意属性,那么确定属性和可选属性的类型都必须是它的类型的子级
interface Person { name: string; age?: number; [propName: string]: any; } let tom: Person = { name: 'Tom', age: 25, //这个就要超出错,因为这个可以没有,但是如果有了就属于任意属性里面的,就只能是string gender: 'male' //任意属性名 }; // 只读属性 readonly id: number; 只可以获取不可以更改值,当然第一次赋值还是可以赋值的