TypeScript基本类型详解

284 阅读5分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第15天,点击查看活动详情

一、前言

常用的前端编辑器有Vscode, idea, WebStorm等

本文采用的相关代码采用vscode进行编写

二、TypeScript基本类型

  • 数字类型(number)
  • 字符串类型(string)
  • 布尔类型(boolean)
  • 数组类型(Array)
  • Object(和any的作用基本相似)
  • Symbol
  • 没有值(undefined或unknown)
  • 空值(void)
  • 任意类型(any)
  • 没有值(never)
  • 枚举(enum)
  • 元祖(tuple)
类型描述例子
number任意数字1,2,3
string任意字符串'a','asad'
boolean布尔类型 true或falsetrue或false
array任意js数组[1,2,3]
object任意js对象{age:18}
sysmbol属性唯一,数字或者字符串Symbol('key')
unknown类型安全的any*
void空值undefined
any任意类型*
never没有值不能是任何值
enum枚举enum{A,B}
tuple元祖, 固定长度数组['a', 1]

三、为变量指定类型

// 在js中, 是没有类型的, 使用 let声明一个变量之后可以为这个变量赋值为数字后继续赋值为字符串
let a;

a = 666;
a = 'hello';

// 但是在ts中, 是存在数据类型的, 如下面的变量B的数据类型就设置为 number(数字)时, 将字符串 ningxuan赋值给b时就会报错
let b: number ;

b = 888;
b = 'ningxuan';// 报错

image.png

// 同理, 当给变量 c设置类型为字符串(string)时, 不能为他赋值字符串之外的类型的值
let c:string;

c = 'ningxuan';
c = 124;// 报错

image.png

// 我们还可以指定类型的时候给其赋值
let d: boolean = true;

// 如果我们的变量的赋值和声明是同时进行的, TypeScript可以自动对变量进行类型检测
// 当我们创建变量 e的时候, 将其赋值为true, 那么默认他的类型为boolean, 为其赋值 123的时候会报错
let e = true

e = 123;//报错

image.png

四、函数

在js中是不考虑参数的类型和个数的, 但是在ts中, 我们可以为参数指定类型, 也可以为函数指定返回值类型

// js函数
// 当执行以下函数的时候, 若传入的两个参数都是数字则相加, 若传入的参数有一个为字符串则是字符串拼接
function sum(f , g){
    f + g;
}
// 执行
sum(1, 2)   // 3
sum(1, '2') // '12'
sum(1,2,3)  // 3, 多出的第三个参数省略

// ts函数
// 当执行以下函数时, 若传入的两个参数都是数字则相加, 若传入的参数中有一个为字符串则报错
function sum2(h: number, i: number ){
    h + i;
}
sum2(1,2)   // 3
sum2(1 , '2')   // 类型错误 报错
sum(1,2,3)  // 参数个数错误, 报错

// 函数返回值指定
function sum3(j:number, k:number): number{
    return j+k
}

image.png

image.png

五、ts中类型的使用

字面量

// 创建变量的时候就为变量设置好变量值, 这个变量值是不可更改的, 类似于java中的常量
let a: 10;
a = 10;
a = 11;

image.png

联合类型

联合类型: 允许一个变量设置为多种类型的值

let b : string | number ;
b = 'hello';
b = 666;

联合类型中字面量的常见使用

let c: 'boy' | 'girt';
c = 'boy';
c = 'girt';

任意类型(any)

一个变量设置为any之后, 相当于对这个变量关闭了TypeScript的类型检测,不建议随便使用, 可用unknown

d = 'hello';
d = 666;
d = true;
d = [1,2,3];

隐式any

声明变量的时候如果不指定类型, 编译器会自动判断这个变量为隐式any

let e;

any的隐患

// 设置e为布尔值的true
e = true;
// 变量b为联合类型, string或者number, 按理来讲是不可以将 true复制给b的, 但是因为e是 any类型, 所以未报错
b = e

未知类型(unknown)

unknown类似于安全的any

虽然unknown也是表示的任意值, 但是不允许直接赋给别的变量

let f: unknown;
f = '111';
b = f;

image.png

unknown复制给其他类型的两种方法

  • 类型检查: 可以判断类型的实际类型
if(typeof f === 'string'){
    b = f;
}
  • 类型断言: 可以告诉解析器类型的实际类型
b = f as string

void

void用来表示空

// 某些情况下函数没有返回值
function fn(): void{

}
// 如果有返回值就会报错
function fn1(): void{
    return 123
}
// 返回值为 '空' 的情况下
function fn2(): void{
    return 
}
// never: 任何情况下都没有返回值
function fn3(): never{
    return
}
// 常用情况
function fn4(): never{
    throw new Error('服务内部错误')
}

Object

Object: js对象

万物皆可对象, 和any一样, 所以我们不建议直接使用

js生成对象方式

let g: Object ;
g = {};
g = function(){};

推荐生成Object对象方式

// 生成对象建议以以下方式来生成
// 语法: {属性名: 属性值, 属性名: 属性值}
let h : {age: number};
h = {age:1};
// 设置对象属性可填可不填
let i : {age: number, name?: string}
i = {age:18}
i = {age: 18, name: 'ningxuan'}

设置动态对象

// propName 为任意名称, string为可选, 范围(number, string, symbol)
let j: {age: number, [propName: string]: any};  // 该变量必须有age属性, 其他属性可选
j = {age: 18}
j = {age: 18, name: 'ningxuan'}
j = {age: 18, name: 'ningxuan', project: 'blog'}
// 但是如果没有age属性的话会报错
j = {name: 'ningxuan'};

image.png

函数结构的类型声明

// 传入两个指定类型参数, 同时指定返回值类型
//  语法: (形参: 类型...) => 返回值类型
let k: (a: number, b: number)=>number
// 定义函数结构
k = function(a, b){
    return a + b
}

数组(array)

// 语法 类型[] 或 Array<number>
let l: number[];
l = [1,1,2,3]
let m: Array<number>;
m = [2,3,4]

元祖

元祖(tuple): 固定长度类型的数组

// 元祖(tuple): 固定长度类型的数组
// 相比于数组效率会高一点
// 语法 [类型, 类型...]
let n: [string, string]
n = ['ningxuan','ningxuan']
// 元祖的元素多了少了, 类型错误都不行
n = ['ningxuan']
n = ['ningxaun','hello','world']
n = ['ningxuan',123]

image.png

枚举

enum o {
    boy='男孩',
    girl='女孩'
}
// 使用
let p : {name:string, genderName: o};
p = {
    name: 'ningxuan',
    genderName: o.boy
}

六、总结

至此, TypeScript的基本数据类型介绍和简单使用就到这里结束了, 如果文中有不对的地方欢迎评论区指教, 毕竟我也是初学者

文中出现的所有代码, 可在下方码上掘金的Script界面查看

image.png