typescript数据类型
1、介绍
TypeScript 支持与 Javascript 几乎相同的数据类型,此外还提供了自己特有的一些类型。
类型声明
类型声明是TS非常重要的一个特点,通过类型声明可以指定TS中变量(参数、形参)的类型,当为变量赋值时,TS编译器会自动检查值是否符合类型声明,符合则赋值,否则报错,类型声明给变量设置了类型,使变量只能存储某种类型的值。
const app:类型
function fn(p1:类型,p2:类型):类型{}
自动类型(类型推论)
当对变量的声明和赋值时同时进行的,TS编译器会自动判断变量的类型,工作中建议还是手动指明变量类型,尽量少的去让TS自动判断类型。
//自动类型
/* var hello = "hello";
console.log(hello); */
//TS可以实现强类型
//声明
var hello : string ;
//赋值
hello = "zhangsan";
console.log(hello);
2、布尔值
let isDone: boolean = false;
let a:boolean;
a = true;
3、数字
let decLiteral: number = 6; // 十进制
let hexLiteral: number = 0xf00d; // 十六进制
let binaryLiteral: number = 0b1010; // 二进制
let octalLiteral: number = 0o744; // 八进制
//数字类型
let age:number;
age = 20;
4、字符串
let name: string = "bob"
let username:string = `aaabbbccc`
5、any 和 unknown
any 任意类型,当前定义的变量,不知道它是什么类型
let app:any = 66
let app:unknown = 66
// let arg: any;
let arg: unknown;
arg = 10;
arg = 'aa'
arg = true;
6、void
它表示没有任何类型,声明一个void类型的变量没什么大用,因为你只能为它赋予undefined 和 null,一般多用于函数返回值指定。
//void 用于函数的返回值,如果一个函数没有返回值,就可以用它
function fn(): void {
console.log('我是没有返回值的函数')
// 不写return
// return null;
// return undefined;
// ========== 推荐写法 =======
// return;
}
fn()
7、null 和undefined
undefined 和 null 两者各自有自己的类型分别是 undefined 和null。和void相似,它们本身的类型用处不是很大。
let u: undefined = undefined;
let n: null = null;
8、never
never 类型表示那些永不存在,永不结束的值的类型
//死循环,永不结束的函数
function kill():never {
while(true){ }
}
//直接抛出错误的函数
function myException(): never {
throw new Error("erro");
}
//不可能出现的值
function fn(name: string | number): void {
if (typeof name === 'string') {
console.log(name)
} else if (typeof name === 'number') {
console.log(name)
}else{
// never
console.log(name)
}
}
9、字面量
可以使用字面量去指定变量的类型,通过字面量可以确定变量取值的范围
let color: 'red' | 'blue' | 'green';
let num: 1 | 2 | 3;
//值只能在字面量中选一个
color = 'red';
10、枚举(enum)
创建枚举类型
// 如果定义的枚举,没有指定它的值,则默认从0开始
enum Color {
Red,
Green,
Blue
}
// 可以直接打印 申明枚举类型
console.log(Color)
// 0
console.log(Color.Red)
如果定义的枚举,如果设置了枚举的值,则值就是为设置的值,如果你设置的值是数
据,则它下面的值从你设置向下累加
enum Color {
Red = 2,
Green,
Blue
}
// 3
console.log(Color.Green)
// 如果设置为字符串,需要全部设置
enum Color {
Red = 'red',
Green = 'green',
Blue = 'blue'
}
// green
console.log(Color.Green)
给变量指定枚举类型
var c:Color
c = Color.Red;
常量枚举,不可以直接打印该枚举类型,但可以读里面的值。
const enum Color {
Red = 'red',
Green = 'green',
Blue = 'blue'
}
// 不可以直接打印类型,但是可以读里面的值
console.log(Color.Red)
var c: Color
c = Color.Red;
11、object
// id是必须要有的,后面可以任意,key为字符串,值为任意类型
let obj:{id:number,name?:string} // ?可选
//对象可以任意添加
var obj: { id: number, name: string, [prop: string]: any }
obj = { id: 1, name: '张三', a: 'b', c: true, d: 1 }
console.log(obj)
// 自定义类型
type userType = {
id: number,
name?: string,
// [prop: string]: any
}
var obj: userType;
obj = { id: 1, name: 'aaa'}
// 类型设置函数定义 接口
type userFnType = {
(id: number, name?: string): void
}
const userFn: userFnType = (id: number, name: string): void => {
console.log('返回值')
}
userFn(1, 'aaa')
12、array
定义数字类型的数组
var arr: number[];
//泛型定义
var arr: Array<number>
13、元组(tuple)
元组类型允许表示一个已知元素数量和类型的数组,各元素的类型不必相同。
定义一个值分别为string和number类型的元组
var arr: [string,number]
arr = ['a',1]
14、自定义类型
可以定义复杂的类型,为业务所用;且便于代码可维护性
自定义对象类型
type objType = { id: number, name: string, [prop: string]: any }
var obj: objType
obj = { id: 1, name: 'zhangsan' }
定义数组对象
type objType = { id: number, name: string }
// var arr: Array<objType>
var arr: objType[];
arr = [{
id: 1,
name: 'lisi'
}]
限制函数的参数和返回值
// type fnType = (id:number,name:string) => string
type fnType = {
(id: number, name: string): string
}
var fn: fnType = (id, name) => {
return name;
}
fn(1, 'aa')
15、联合类型
给变量指定多个类型
var id:number | string
function fn(par:string|number){
}
16、类型断言
有些情况下,变量的类型对于我们来说很明确,但是TS编译器却并不清楚,此时可以通过类型断言告诉编译器变量的类型。
断言的两种形式:
var str: number | string
// 形式1
// console.log((str as string).length);
//形式2
console.log((<string>str).length);
//断言的特殊情况
//变量后加 ! 表示不能为null,加 ? 表示可以为null