TypeScript原始数据类型表达
为了让程序有价值,我们需要能够处理最简单的数据单元:数字,字符串,结构体,布尔值,any等。 TypeScript支持与JavaScript几乎相同的数据类型,此外还提供了实用的枚举类型方便我们使用。
原始数据类型包括:布尔值(boolean)、数值(number)、字符串(string)、null、undefined 以及 ES6 中的新类型 Symbol和 ES10 中的新类型 BigInt。
TypeScript声明变量时需要指定数据类型具体表达式
let 变量名:数据类型
let propName : string = 'test' ;
布尔值
// boolean
// ts原型
let isLogin = false;
// 等同于
let isLogin:boolean = false;
以构造函数方式:
let createdByNewBoolean:Boolean=new Boolean(1);
//直接调用 Boolean 也可以返回一个 boolean 类型:
let createdByNewBooleans:boolean=Boolean(1);
数字
和JavaScript一样,TypeScript里的所有数字都是浮点数。 这些浮点数的类型是 number。 除了支持十进制和十六进制字面量,TypeScript还支持ECMAScript 2015中引入的二进制和八进制字面量。
// 基本数据类型
let num = 25;
let float = 25.5;
let hex = 0xf000; // 16进制
let binary = 0b1001; // 2进制
let octal = 0o733; // 8进制
// 重新赋值
num = '25';
// 会报错,可以在终端编写 tsc 进行查看错误.
// ts原型
let num = 25;
// 等同于
let num: number = 25;
字符串
let myName:string='Tom';
模板字符串
let sentence:string =`Hello,my name is ${myName}.I'll be ${myAge + 1} years old next month.`;
空值
JavaScript 没有空值(Void)的概念,在 TypeScript 中,可以用 void 表示没有任何返回值的函数:
function alertName():void {
alert('My name is Tom');
}
声明一个 void 类型的变量没有什么用,因为你只能将它赋值为 undefined 和 null
let unusable:void=undefined;
Null和Undefined
在 TypeScript 中,可以使用 null 和 undefined 来定义这两个原始数据类型:
let u:undefined=undefined;
let n:null=null;
与 void 的区别是,undefined 和 null 是所有类型的子类型。也就是说 undefined 类型的变量,可以赋值给 number 类型的变量:
let num:number=undefined;
//或
let uf=undefined;
let newNum:number=uf;
而 void 类型的变量不能赋值给 number 类型的变量
let uv:void;
let nums:number=uv;//Type 'void' is not assignable to type 'number'
any
什么是任意值类型
如果是一个普通类型,在赋值过程中改变类型是不被允许的:
let number: string = 'two';
number = 7//Type 'number' is not assignable to type 'string'
但如果是 any 类型,则允许被赋值为任意类型。
let number: any = 'two';
number = 7
任意值的属性和方法
在任意值上访问任何属性都是允许的:
let anyThing: any = 'hello';
console.log(anyThing.myName);
console.log(anyThing.myName.firstName);
也允许调用任何方法:
let anyThing: any = 'Tom';
anyThing.setName('Jerry');
anyThing.setName('Jerry').sayHello();
anyThing.myName.setFirstName('Cat');
可以认为,声明一个变量为任意值之后,对它的任何操作,返回的内容的类型都是任意值。
未声明类型的变量
变量如果在声明的时候,未指定其类型,那么它会被识别为任意值类型:
// any
let anything;
// 等同于
let anything: any
// 没报错的原因,只是开辟了一个空间,但是没有定义其类型
anything = 25;
anything = 'hello'
注意:在上面的例子中:anything 赋予任何值都不会报错,是因为只是给 anything 开辟了一个空间,但是并没有定义其类型。在项目中,尽量避免需用 any,不太利于后期维护。
never
// never类型是任何类型的子类型,也可以赋值给任何类型;然而,没有类型是never的子类型或可以赋值给never // 类型(除了never本身之外)。及时any也不可以赋值给never。通常表现为抛出异常或无法执行到终点(例如无限循环)
let x: never;
// x = 123; // 报错:不能将类型“123”分配给类型“never”。
// never的应用场景 抛出异常
function error(message: string): never {
throw new Error(message);
}
// 死循环
function loop(): never {
while (true) {}
}
let y: number;
y = ( () => {
throw new Error('message');
})();
Symbols
Symbols是ES6新增的原始数据类型,ts中使用时需要先配置
1、配置tsconfig.json
"lib": ["es6"], 需要dom时还要将"dom"添加进lib,如:console.log语句
2、特性
(1)不能和其他值计算,如加键、字符串拼接等
(2)可以调用.toString()返回字符串
(3)本身作为true类型存在
(4)类似for in遍历时,不会遍历symbol属性
可通过Object.getOwnPropertySymbols(对象)/Reflect.ownKeys(obj)获取symbol属性
3、语法
let x=Symbol(); 即使再次调用也不会生成相同值
let x=Symbol('传入值作为标识'); 增加可读性,即使传入相同值也不会相等
let x=Symbol.for('传入值作为标识'); 当使用.for方法创建的标识值存在时会返回那个symbol,否则会创建
let x=Symbol.keyFor(Symbol.for方法创建的变量); 返回.for创建时传入的标识值
作为对象/类属性
let obj={
[x]:'值' 必须使用[]进行解析,调用时也只能obj[x]进行调用
}
class C={
[x](){}
}
内置symbol属性
(1)Symbol.hasInstance
当使用instanceof时,之后的对象将会执行对象[Symbol.hasInstance]执行的方法
如:
let obj={
[Symbol.hasInstance](otherObj){ 参数为instanceof前比较的对象
...
}
}
console.log(x instanceof obj)
(2)Symbol.isConcatSpreadable
当为数组设置Symbol.isConcatSpreadable属性为false时,调用.concat方法不会拆开
如:
let arr=[1,2]
arr[Symbol.isConcatSpreadable]=false;
console.log([].concat(arr,[3,4])) 返回 [[1,2],3,4]
(3)Symbol.species
创建衍生对象的构造函数
(4)Symbol.match
当调用字符串的match方法时,会触发match中对象的该属性对应的方法
同理还有:Symbol.search、Symbol.replace、Symbol.split
如:
let obj={
[Symbol.match](string){
...
}
}
'xxx'.match(obj)
(5)Symbol.iterator
指向默认的遍历器方法
let arr=[1,2,3];
1、返回遍历器:
const iterator=arr[Symbol.iterator]
2、通过遍历器进行遍历:
iterator.next(); 会返回当前遍历的内容{value:值,done:是否遍历完成的布尔值}
(6)Symbol.toPrimitive
当对象被转换成原始类型时,调用Symbol.toPrimitive属性指定的方法
如:
let obj={
[Symbol.toPrimitive](type){ type为被转换成的原始类型
...
}
}
obj++; type为number
(7)Symbol.toStringTag
当对象调用toString()方法时,返回的结果会附带Symbol.toStringTag对应的值
如:
let obj={
[Symbol.toStringTag]:lion
作为方法必须时get方法
get [Symbol.toStringTag](){
return 'lion'
}
}
obj.toString(); 打印[object lion]
(8)Symbol.unscopables
当使用with方法时,无法获取到的属性
with(对象){
直接属性名即可获取,等同于对象.属性名
}
Array.prototype[Symbol.unscopables]可查看数组中不能使用with访问的属性
BigInt
bigint 数据类型是用来表示那些已经超出了 number 类型最大值的整数值,对于总是被诟病的整数溢出问题,使用了 bigint 后将完美解决。
bigint 是一种基本数据类型(primitive data type)。
JavaScript 中可以用 Number 表示的最大整数为 2^53 - 1,可以写为 Number.MAX_SAFE_INTEGER。如果超过了这个界限,可以用 BigInt来表示,它可以表示任意大的整数。
在一个整数字面量后加 n 的方式定义一个 BigInt,如:10n 或者调用函数 BigInt():
const theBiggestInt: bigint = 9007199254740991n
const alsoHuge: bigint = BigInt(9007199254740991)
const hugeString: bigint = BigInt("9007199254740991")
theBiggestInt === alsoHuge // true
theBiggestInt === hugeString // true
BigInt 与 Number 的不同点:
BigInt 不能用于 Math 对象中的方法。
BigInt 不能和任何 Number 实例混合运算,两者必须转换成同一种类型。
BigInt 变量在转换为 Number 变量时可能会丢失精度。