TS学习笔记之基础数据类型

基础数据类型

js的数据类型在ts中都有与之对应的类型。

ini 复制代码
const temp1: string = 'jack';
const temp2: number = 1;
const temp3: boolean = true;
const temp4: undefined = undefined;
const temp5: null = null;
const temp6: object = { name: 'jack' };
const temp7: symbol = Symbol('jack');
const temp8: bigint = 111111n;

值得注意的的是在关闭strictNullChecks后, null和undefined被看做是其它类型的子类,可以赋值给任意类型的变量。

ini 复制代码
const temp8: string = undefined;
const temp9: number = null;
const temp10: null = undefined;
const temp11: undefined = null;

void

void类型用于表示函数的返回值为空或者没有返回值

javascript 复制代码
function foo():void{};
function bar():void{return};
function min():void { return void 0 };
function sider():void { return undefined };

数组类型

数组有两种声明方式

ini 复制代码
const arr: string[] = [];
const arr1: Array<string> = [];

对于长度固定的数组来说,可以使用元祖类型进行声明,当访问越界的时候ts会给出警告提示。

ini 复制代码
// 数组显式越界
const arr2: number[] = [1,2,3];
const tupe2: [number,number,number] = [1,2,3];
arr[5]; //undefiend
tupe2[5]; //长度为 "3" 的元组类型 "[number, number, number]" 在索引 "5" 处没有元素

// 隐式越界
const [a,b,c,d] = tupe2; //长度为 "3" 的元组类型 "[number, number, number]" 在索引 "3" 处没有元素。ts(249

对象类型

对象类型的声明可以使用interface和type

typescript 复制代码
interface  User{
    account: string,
    readonly modifyDate: string, // 只读
    avatorUrl?: string; // 可选属性
}
// 类型别名
type Book = {name: string, readonly price: number,  author?: string };

interface和type在功能相近,很多场景可以替换使用,比较推荐的做法是使用interface声明类和对象的结构,使用类型别名声明函数、联合类型、类型体操等更复杂的场景。除此之外type和interface在功能上也有一些差异: type中可以使用联合类型,多个同名interface会进行合并

kotlin 复制代码
interface Book{
    name: string;
}

interface Book{
    price: number;
}

const JsBook: Book = { name: "JavaScript", price: 28}

Object、object以及{}

在javascript中object是原型链的顶端,而在ts中Objcet包含所有类型

ini 复制代码
const tem1: Object = 1;
const tem2: Object = 'str';
const tem3: Object = {name:'jack'};
const tem4: Object = [];
const tem5: Object = () => {}

object 类型在ts中才是真正和js中的object对应的, 我们知道在js中数组、对象、函数、都是属于object类型,因此你可以使用object类型声明数组、对象和函数。

ini 复制代码
const obj1: object = { name: 'jack' };
const obj2: object =[];
const obj3: object = ()=>{};
const obj4: object = 1; //不能将类型"number"分配给类型"object"

所以应该使用object去声明一个对象类型而不是Object, 类似的还有 String、Number、Boolean等装箱类型,它们也包含类一些超出预期的类型,所以任何情况下都不要使用这些装箱类型。

{}使用字面量声明类一个空的对象。

字面量类型

字面量类型可以更精准的定义类型。字面量类型有字符字面量类型、数字字面量类型和布尔字面量类型、对象字面量类型等。

ini 复制代码
let tem1: 'jack' = 'jack';

let tem2: 8 = 8;

let tem3: false = false;

interface tem4 {
  name: 'jack',
  age: 21,
}

联合类型和交叉类型

前面我们讲到在类型别名中可以使用联合类型和交叉类型。联合类型的操作符是 "|", 可以理解为js中的||(逻辑或),只要满足其中的一个类型就符合这个联合类型。而交叉类型则对应js中的&&(逻辑与), 会将多个类型进行合并,合并后的每个类型都要满足才算符合这个交叉类型。

ini 复制代码
// 联合类型
type Code = 1001 | 1002 | 1003;
type Name = 'jack' | 'rose' | 'lucy';
type Users = { type: 'common' } | { type: 'vip' };
type Bol1 = true | false; // boolean

// 交叉类型
type UserCommon = { name: string } & { age: number };
const user1: UserCommon = { name: 'jack', age: 21 };
type Bol2 = false & true; //never

枚举

枚举类型和对象类型的区别是,枚举类型是双向映射的,可以通过成员属性访问枚举值,也可以通过枚举值访问成员属性

arduino 复制代码
enum Colors {
  red, // 0
  green, // 1
  yeellow, // 2
  blue,//3
  pink,// 4
}

enum Books {
  JavaScript, // 0
  TypeScript, // 200
  Java, // 201
  Ruby,//202
  Python,// 203
}

console.log(Colors.red);// 0
console.log(Colors[0]); // red

还可以声明常量枚举,常量枚举只能通过成员属性访问值,而不能通过枚举值访问成员。

arduino 复制代码
// 常量枚举
const enum Colors {
  red, // 0
  green, // 1
  yeellow, // 2
  blue,//3
  pink,// 4
}

console.log(Colors.red);// 0
console.log(Colors[0]); // 报错:只有使用字符串文本才能访问常数枚举成员
相关推荐
To_OC7 小时前
别再串行写 await 了,Promise.all 才是并行请求的正确打开方式
前端·javascript·promise
vipbic8 小时前
中后台越做越乱后,我用插件化把它救回来了
前端·vue.js
Hyyy8 小时前
Computer Use 适合做什么,不适合做什么——一次真实使用后的思考
前端
小和尚同志8 小时前
前端 AI 单元测试思考与落地
前端·人工智能·aigc
invicinble9 小时前
c端系统,其实更像一个信息展示平台
前端
李姆斯10 小时前
管理是否可以被完全量化
前端·产品经理·团队管理
名字还没想好☜11 小时前
Next.js 中间件实战:鉴权、重定向与 A/B 分流
开发语言·前端·javascript·中间件·react·next.js
广州灵眸科技有限公司11 小时前
瑞芯微RV1126B开发板(EASY-EAI-PI2) INI文件操作
java·前端·javascript·网络·人工智能
kaiking_g12 小时前
vue项目中,静态导入 vs 动态导入 详解
前端·javascript·vue.js
江华森12 小时前
Web 开发基础:HTTP 与 REST
前端·网络协议·http