40 TypeScript基本类型-字面量、any、void、object、array、type等

简介

TypeScript是JavaScript的超集,它对JS进行了扩展,向JS中引入了类型的概念,并添加了许多新的特性。

TS代码需要通过编译器编译为JS,然后再交由JS解析器执行

TS完全兼容JS,换言之,任何的JS代码都可以直接当成JS使用

相较于JS而言,TS拥有了静态类型,更加严格的语法,更强大的功能;

TS可以在代码执行前就完成代码的检查,减小了运行时异常的出现的几率;

TS代码可以编译为任意版本的JS代码,可有效解决不同JS运行环境的兼容问题;

同样的功能,TS的代码量要大于JS,但由于TS的代码结构更加清晰,变量类型更加明确,在后期代码的维护中TS却远远胜于JS

开发环境的搭建

1. 安装 node.js

2. 使用npm全局安装typescript

npm i -g typescript

# 是否安装成功 
tsc

3. 创建一个 1.ts 文件

4. 使用tsc对ts文件进行编译

  • 进入命令行

  • 进入ts文件所在目录

  • 执行命令:tsc 1.ts

类型声明

类型声明是TS非常重要的一个特点,通过类型声明可以指定TS中变量(参数、形参)的类型

指定类型后,当为变量赋值时,TS编译器会自动检查值是否符合类型声明,符合则赋值,否则报错

简而言之,类型声明给变量设置了类型,使得变量只能存储某种类型的值

语法:

# 声明一个变量
let 变量: 类型;

# 声明一个变量,同时赋值给变量
let 变量: 类型 = 值;

# 声明函数,给形参和函数返回值 设置类型
function fn(参数: 类型, 参数: 类型): 类型{
    ...
}

简单的案例

<script lang="ts" setup>
let a: number = 10; // 变量a只能存储数值
let b: string = 'Hello'; //变量b只能存储字符串
let c: boolean = true; //变量c只能存储布尔值

// 参数x必须是数字,参数y也必须是数字,函数返回值也必须是数字
function fn(x: number, y: number): number {
  return x + y;
}

console.log(fn(1, 2)); // 返回值3
</script>

自动类型判断

TS拥有自动的类型判断机制:当对变量的声明和赋值是同时进行的,TS编译器会自动判断变量的类型,所以如果你的变量的声明和赋值时同时进行的,可以省略掉类型声明

<script lang="ts" setup>
// 变量的声明和赋值时同时进行的,所以省略掉类型声明
let a = 10; // 变量a只能存储数值
let b = true; //变量c只能存储布尔值

// 重新赋值的时候,类型不能随便赋值
a = 20;
b = false;
</script>

类型

类型概述

JavaScript 中的数据类型

string  # 字符串
number  # 数字
boolean  # 布尔值true或false
null
undefined
bigint
symbol
object
array
date
function

TypeScript 中的数据类型

1. JS所有数据

2. 四种新类型:void never unknown any enum tuple

3. 自定义类型:type、interface

image

常用类型

字面量

可以使用字面量去指定变量的类型,通过字面量可以确定变量的取值范围

<script lang="ts" setup>
let a: '你好'; 
// a的值只能为字符串“你好”
a = '你好' ; // 不会警告
a = '欢迎'; // 警告:不能将类型“"欢迎"”分配给类型“"你好"”


let b: 100; 
// b的值只能为数字100
b = 200; // 警告:不能将类型“200”分配给类型“100”

# 可以使用 | 来连接多个类型(联合类型)
let gender: '男' | '⼥'; //定 义⼀个gender变量,值只能为字符串“男”或“⼥”
gender = '男';
gender = '女';
gender = '未知'; // 不能将类型“"未知"”分配给类型“"男" | "⼥"”


let c:boolean | string
c=true;
c='hello'
</script>

any任意类型--不建议使用

any 的含义是:任意类型,⼀旦将变量类型限制为 any ,那就意味着放弃了对该变量的类型检查

any 类型的变量,可以赋值给任意类型的变量

<script lang="ts" setup>
// 明确的表示a的类型是any —— 显式的any
let a: any;
//以下对a的赋值,均⽆警告
a = 100;
a = '你好';
a = false;


// 声明的变量,如果没有指定类型,则TS会自动判定变量类型为any—— 隐式的any
let b;
//以下对b的赋值,均⽆警告
b = 100;
b = '你好';
b = false;
</script>

unknown 未知类型

unknown 可以理解为⼀个类型安全的 any

unknown 适⽤于:开始不知道数据的具体类型,后期才能确定数据的类型

<script lang="ts" setup>
// 设置a的类型为unknown
let a: unknown;
//以下对a的赋值,均正常
a = 100;
a = false;
a = '你好';

// unknown 可以理解为⼀个类型安全的 any,同时unknown类型的变量不能赋值为其他类型的变量
// 设置x的数据类型为string
let x: string;
x = a; //警告:不能将类型“unknown”分配给类型“string”
</script>

若就是想把一个 unknown 赋值给 一个其他类型的值 ,可以⽤以下三种写法:

<script lang="ts" setup>
// 设置a的类型为unknown
let a: unknown;

// 设置x的数据类型为string
let x: string;
x = a; //警告:不能将类型“unknown”分配给类型“string”

// 若就是想把 a 赋值给 x ,可以⽤以下三种写法:
// 第⼀种⽅式:加类型判断
if (typeof a === 'string') {
  x = a;
}

//第⼆种⽅式:加断⾔
x = a as string;

//第三种⽅式:加断⾔
x = <string>a;
</script>

any 后点任何的东⻄都不会报错,⽽ unknown 正好与之相反

<script lang="ts" setup>
let str1: string = 'hello'
str1.toUpperCase() //⽆警告


let str2: any = 'hello'
str2.toUpperCase() //⽆警告


let str3: unknown = 'hello';
str3.toUpperCase() // 警告:“str3”的类型为“未知”
 
// 使⽤断⾔强制指定str3的类型为string
(str3 as string).toUpperCase() //⽆警告
</script>

never不能有值

never 的含义是:任何值都不是,简⾔之就是不能有值, undefined 、 null 、 '' 、 0 都不⾏

  1. ⼏乎不⽤ never 去直接限制变量,因为没有意义,例如:
let a: never
// 以下对a的所有赋值都会有警告
a = 1
a = true
a = undefined
a = null
  1. never ⼀般是 TypeScript 主动推断出来的,例如:
<script lang="ts" setup>
// 指定a的类型为string
let a: string;
// 给a设置⼀个值
a = 'hello';
if (typeof a === 'string') {
  a.toUpperCase();
} else {
  console.log(a); // TypeScript会推断出此处的a是never,因为没有任何⼀个值符合此处的 逻辑
}
</script>

  1. never 也可⽤于限制函数的返回值
// 限制error函数不需要有任何返回值,任何值都不⾏,像undeifned、null都不⾏
function error(message: string): never {
  throw new Error(message);
}

void: 空 或 undefined

void 的含义是: 空 或 undefined ,严格模式下不能将 null 赋值给 void 类型

let a:void = undefined
//严格模式下,该⾏会有警告:不能将类型“null”分配给类型“void”
let b:void = null

# 常⽤于限制函数返回值
// ⽆警告
function demo1():void{
}
// ⽆警告
function demo2():void{
 return
}
// ⽆警告
function demo3():void{
 return undefined
}
// 有警告:不能将类型“number”分配给类型“void”
function demo4():void{
 return 666
}

object

在类型限制时, Object ⼏乎不⽤,因为范围太⼤了,⽆意义

  • object 的含义:任何【⾮原始值类型】,包括:对象、函数、数组等,限制的范围⽐较宽泛,用法较少
let a:object //a的值可以是任何【⾮原始值类型】,包括:对象、函数、数组等

// 以下代码,是将【⾮原始类型】赋给a,所以均⽆警告
a = {}
a = {name:'张三'}
a = [1,3,5,7,9]
a = function(){}


// 以下代码,是将【原始类型】赋给a,有警告
a = null // 警告:不能将类型“null”分配给类型“object”
a = undefined // 警告:不能将类型“undefined”分配给类型“object”
a = 1 // 警告:不能将类型“number”分配给类型“object”
a = true // 警告:不能将类型“boolean”分配给类型“object”
a = '你好' // 警告:不能将类型“string”分配给类型“object”
  • Object 的含义: Object 的实例对象,限制的范围太⼤了,⼏乎不⽤
let a:Object //a的值必须是Object的实例对象,

// 以下代码,均⽆警告,因为给a赋的值,都是Object的实例对象
a = {}
a = {name:'张三'}
a = [1,3,5,7,9]
a = function(){}


a = 1 // 1不是Object的实例对象,但其包装对象是Object的实例
a = true // truue不是Object的实例对象,但其包装对象是Object的实例
a = '你好' // “你好”不是Object的实例对象,但其包装对象是Object的实例
// 以下代码均有警告
a = null // 警告:不能将类型“null”分配给类型“Object”
a = undefined // 警告:不能将类型“undefined”分配给类型“Object”

实际开发中,限制⼀般对象,通常使⽤以下形式

  1. 限制person对象的具体内容,使⽤【,】分隔
    在属性后面加上 ? 问号代表可选属性
let person: { name: string, age?: number };

// 以下代码均⽆警告
person = { name: '张三', age: 18 };
person = { name: '李四' };
  1. 限制car对象的具体内容,使⽤【;】分隔,必须有price和color属性,其他属性不去限制,有没有都⾏
// [propName: string]: any 表示其他属性不做限制,有么有都可以
let car: { price: number; color: string; [propName: string]: any };
// 以下代码均⽆警告
car = { price: 100, color: '红⾊' };
  1. 限制student对象的具体内容,使⽤【回⻋】分隔
let student: {
  id: string;
  grade: number;
};
// 以下代码均⽆警告
student = { id: 'tetqw76te01', grade: 3 };
  1. 设置函数结构的类型声明

语法:(形参:类型,形参:类型,...)=>返回值

<script lang="ts" setup>
let demo: (a: number, b: number) => number;
demo = function (x, y) {
  return x + y;
};
</script>

数组

数组的类型声明:
Array<类型>
类型[]

2种声明的方式如下:

let arr1: string[] = ['1', '2', '3'];
// 等价于下面的:
let arr11: Array<string> = ['1', '2', '3'];

let arr2: number[] = [1, 2, 3];
// 等价于下面的:
let arr22: Array<number> = [1, 2, 3];

-----
// 声明一个number类型的数组
let arr: number[];
// 给数组赋值
arr = [1, 2, 3];

// 结合 type自定义类型使用
type person={
id:string,
name:string,
age:number
}

let list=<person>[{id:'',name:'',age"10}]


tuple-固定长度的数组

<script lang="ts" setup>
let t: [string, number];
t = ['hello', 123];

// 警告,不能将类型“[string, number, boolean]”分配给类型“[string, number]”
t = ['hello', 123, false];
</script>

enum枚举值

<script lang="ts" setup>
// 定义⼀个枚举Color
enum Color {
  Red,
  Blue,
  Black,
  Gold,
}

// 定义⼀个phone变量,并对其颜色进⾏限制
let phone: { name: string; price: number; color: Color };
phone = { name: '华为Mate60', price: 6500, color: Color.Red };
phone = { name: 'iPhone15Pro', price: 7999, color: Color.Blue };
console.log(phone);
</script>

type 自定义类型

⾃定义类型,可以更灵活的限制类型

<script lang="ts" setup>
type myStudentType = {
  name: string;
  age: number;
};

let obj1: myStudentType = {
  name: '张三',
  age: 18,
};
let obj2: myStudentType = {
  name: '李四',
  age: 20,
};

console.log(obj1);
console.log(obj2);

// 也等价于下面的写法
let obj3: { name: string; age: number };
obj3 = { name: '王五', age: 13 };
console.log(obj3);
</script>

posted @ 2024-04-12 11:29  songxia777  阅读(50)  评论(0编辑  收藏  举报