TypeScript——基本类型二

该文章已生成可运行项目,

number与bigint

有了上面boolean类型的说明,其他的基本数据类型基本一致

bigint是ES11(ES2020)新增的一种基本数据类型,在JS中,可以用 Number 表示的最大整数为 2^53 - 1,可以写为 Number.MAX_SAFE_INTEGER。如果超过了这个界限,那么就可以用 BigInt 来表示,它可以表示任意大的整数。

在一个整数字面量后面加 n 的方式定义一个 bigint,或者调用函数 BigInt()

注意这里强调的问题:ES11(ES2020),如果编译的时候没有指定tsconfig的target(指定代码编译成的版本)和lib(TSC假定运行代码的环境)为es2020以上的版本,或者执行tsc的时候,没有指定–target为es2020以上版本,将会编译报错

let a = 123;
let b = Infinity * 0.10;
const c = 567;
let d = a < b;
let e: number = 100;
let f: 26.218 = 26.218;
// let g: 26.218 = 10; // error 不能将类型10分配给类型26.218

let a1 = 1234n;
const b1 = BigInt(1234);
const b2 = 1234n;;
let d1 = a < a1;
// let e1 = 1234.5n; // error bigint字面量必须是整数
// let f1: bigint = 1234; // error 不能将类型number分配给类型bigint
let g1: bigint = 100n; 
let h1: 100n = 100n;
  1. 可以让TS推导出值的类型为number/bigint(a,b,a1,b1)
  2. 可以明确的告诉TS,值的类型为number/bigint(e,f1)
  3. 可以明确的告诉TS,值为某个具体的number/bigint值(e,f,g,g1,h1)
  4. 可以让TS推导出(const)值为某个具体的number/bigint值(c,b2)

string

与boolean和number形式是一样的,而且string字符串形式同样有单引号'',双引号""和模板字符串``的形式

模板字符串还可以有其他的作用,这个在后期再给大家介绍

symbol

symbol 符号是ES6新增的一种基本数据类型。

**注意:**如果编译的时候没有指定tsconfig的target和lib为es6(ES2015)以上的版本,或者执行tsc的时候,没有指定–target为es2015以上版本,将会编译报错

symbol经常用于代替对象和映射的字符串键,确保使用正确的键,以防键被意外设置。

let a = Symbol('a');
let b: symbol = Symbol('a');

console.log(a === b);  // false

let obj = {
  name: 'Symbol',
  [a]: 'jack',
  [b]: function () {
    console.log('ts')
  }
}
console.log(obj);

for (let key in obj) {
  console.log("---", key);
}

Symbol(‘a’)使用指定的名称新建了一个符号,这个符号是唯一的,不与其他任何符号相等,即便再使用相同的名称创建一个符号也是如此。

symbol 属性不参与 for..in 循环。Object.keys()也会忽略他们

当然 symbol也能进行全局注册:

let id1 = Symbol.for('id')

const user = {
  [id1]: 123
}

console.log(user[id1]) // 123
console.log(id1)      // Symbol(id)

let id2 = Symbol.for('id')

console.log(id1 === id2) // true
console.log(user[id2]) // 123
console.log(id2)      // Symbol(id)

Symbol.for() 方法创建前,会首先搜索 全局符号注册表 ,看看是否存在一个键值为 id符号值 。如果存在就会返回已存在的 符号值 ;否则创建一个新的 符号值

但是,如果使用const声明的symbol将会是unique symbol类型

const c = Symbol('a'); // typeof c
const d: unique symbol = Symbol('a'); // typeof d
//let e: unique symbol = Symbol('a'); // error unique symbol的变量必须为const

console.log(c === c);
console.log(c === d); // error 此比较没有意义,类型typeof c和typeof d没有重叠

unique symbol类型与其他字面量类型其实是一样的,比如1true"hello",创建的是表示特定符号的类型

类型拓宽

类型拓宽(type widening)是理解TS类型推导机制的关键。

一般来说,TS在推导类型的时候会放宽要求,故意推导出一个更宽泛的类型,而不限定为每个具体的类型。

声明变量时如果运行以后修改变量的值(例如使用letvar声明),变量类型将拓宽,从字面值放大到包含该字面量的基础类型

let a = 'x';  // string
let b = 123;  // number
let c = true; //boolean

然而,使用const声明不可变的变量时,情况不同,会自动的把类型缩窄

const a = 'x'  // 'x'
const b = 123  // 123
const c = true // true

我们当然可以显示的标注类型防止类型拓宽

let a:'x' = 'x';   // 'x'
let b:123 = 123;   // 123
let c:true = true; // true

不过使用**const声明的对象,并不会缩窄推导的类型**

const obj = {
  b: 123  // b是number类型
}

因为Javascript对象是可变的,所以在Typescript看来,创建对象之后你可能会更新对象

本文章已经生成可运行项目
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

几何心凉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值