从零开始学习typescript系列6: typescript各种类型以及类型特殊使用

本文主要是介绍从零开始学习typescript系列6: typescript各种类型以及类型特殊使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

基础类型的分类

常用

  • boolean: 布尔值
  • number: 支持2/8/10/16进制
  • string: 字符串
  • enum: 枚举类型,可根据value找到key
  • array: 普通数组,有2种方式,string[]或者 Array<string>
  • tuple: 特殊数组,指定数组里的每个元素的类型,同时也确定了元素个数

其他

  • any: 不确定类型的变量
  • void: 没有任何返回值的函
  • undefined/null: 2种特殊类型
  • <>: 非常确定的类型

array和tuple的区别?

// array例子: 数组元素类型相同,都是string
let arr1: string[] = ['a','b'];
// tuple例子: 数组元素类型可以不同
let tp1: [number, string] = [1,'abc'];

boolean

// boolean
let isDone: boolean = true;
let disabled: boolean = false;
console.log(`isDone: ${isDone}`);   // isDone: true
console.log(`disabled: ${disabled}`); //disabled: false

number

// number 可以是 十进制,十六进制,八进制,二进制
let n1: number = 666;
let n2: number = 0x0a;
let n3: number = 0o17;
let n4: number = 0b11;
console.log(`n1: ${n1}`); // n1: 666
console.log(`n2: ${n2}`); // n2: 10
console.log(`n3: ${n3}`); // n3: 15
console.log(`n4: ${n4}`); // n4: 3

string

// string 支持模板字符串
let myname: string = 'john';
let myage: number = 18;
let greeting: string = `i am ${myname} and i am ${myage} years old!`
console.log(greeting); // i am john and i am 18 years old!
// 对比 string 和 String
// 1. 普通变量 小写string
export type Todo = {id: number,title: string,completed: boolean
}
// 2. Vue props变量 大写String
defineProps({msg:{type: String}
})

object

// object类型
let obj_1:object;
obj_1 = {name:'peter'};
console.log(`obj_1:`,obj_1); // obj_1: { name: 'peter' }

array

// 2种array定义方式
let arr1: string[] = ['a','b'];
let arr2: Array<number> = [1,2,3]; // 数组泛型
console.log(arr1); // [ 'a', 'b' ]
console.log(arr2); // [ 1, 2, 3 ]

类数组是什么?

  • 比如 arguments 是类数组,不能用普通数组类型,应该用interface类型
  • 比如 let args:IArguments = arguments
  • 其他常见的类数组interface有: IArguments, NodeList, HTMLCollection 等

arguments 的1种错误类型和2种正确类型图解如下

tuple

// tuple 元组
// 特殊的数组 定义了类型和数目的数组(指定每个元素的类型)
let tp1: [number, string] = [1,'abc'];
let tp2: [number, string, string] = [1,'abc', ''];
tp2[2] = 'x'; // ok 
tp2[3] = 'y'; // error y is not assignable to type => tuple定义后,不能再新增元素

enum

// 先定义枚举集合
enum Color {Red = 2, Green = 1, Blue};
// 使用1: 获取枚举常量值 
let c1: Color = Color.Red; // c1=2
let c2: Color = Color.Green;  // c2=1 
let c3: Color = Color.Blue; // c3=2 自动计算
// 使用2: 通过常量值反过来获取对应的key 
let cname1: string = Color[2]; // cname1='Blue'

any

// 任意值 不确定类型的变量 
let notSure: any;
notSure = 1; // OK 
notSure = 'abc'; // OK// 变量声明未指定其类型 会被识别为任意值类型
let a;  // 等价于 let a:any;

void

// void: 表示没有任何类型
// 使用场景: 函数没有返回值的情况
function f1(): void{console.log('no return');
}
function f2(): string{return 'have return'
}
console.log(f1()); // void -> no return
console.log(f2()); // have return

undefined null

// undefined null
let empty1: undefined = undefined;
let empty2: null = null;console.log(empty1); //  undefined
console.log(empty2); //  null

内置对象

  • ECMAScript 的内置对象 Boolean、Error、Date、RegExp
  • DOM 和 BOM 的内置对象 Document、HTMLElement、Event、NodeList
let body: HTMLElement = document.body;
let allDiv: NodeList = document.querySelectorAll('div');
document.addEventListener('click', function(e: MouseEvent){// do something
})

自动类型推论 type inference

// 1. 变量定义时有赋值: 根据[赋值]推测出[类型]
let  myName = 'Jim'; // 推断类型为string
myName = 7; //error: type number // 2. 定义时没有赋值: 被推断成 [any 类型]
let  myName; // 推断类型为any
myName = 'Jim'; //ok
myName = 7; //ok

联合类型 union types

// 什么是联合类型? 变量可能为多种类型
let myLuckyNumber : string | number;
myLuckyNumber = 'two' // OK 
myLuckyNumber = 2 // OK // 联合类型自动推断
let myLuckyNumber : string | number;
myLuckyNumber = 'two' 
console.log(myLuckyNumber.length)  // OK 类型推断为string length ok 
myLuckyNumber = 2 // OK 
console.log(myLuckyNumber.length)  // 类型推断为string number no! 报错: Property 'length' does not exist on type 'number'. // 联合类型变量的方法调用
function getString1(luck: string | number):string{return luck.toString() // OK 因为 string number 都存在 toString 方法 
}
function getString2(luck: string | number):string{return luck.slice(1)// ERROR 因为 string  有slice方法,但是 number 没有 slice方法 
}

类型别名 type aliases

// 语法: 关键字是type
// 用途: 常用于联合类型
type Name = string;
type NameResolver = () => string;
type NameOrResolver = Name | NameResolver;
function getName(n: NameOrResolver): Name {if (typeof n === 'string') {return n;} else {return n();}
}

类型断言 type assertion

类型断言:

  • 表示程序员非常确认类型,可以实现类型自动转化
// 语法1. as关键字 ,如 str as string, counter as number 
let verysure: any = 'very sure type';
let len: number = (verysure as string).length; 
console.log(verysure); // very sure type
console.log(len); // 14// 语法2. 尖括号,如`<string>str, <number>counter`
let verysure: any = 'very sure type';
let len: number = (<string>verysure).length; 
console.log(verysure); // very sure type
console.log(len); // 14

泛型 Generics

// without Generics
function genArray (n: Number, v: any): Array<any> {let result = [];for(let i=0; i<n; i++){result[i] = v;}return result; // 返回N个v数组 [v,v,...]
}// with Generics
// 函数名后的T: 定义泛型 
// 参数和返回值后的T: 使用泛型
function genArray1<T> (n: Number, v: T): Array<T> {let result = [];for(let i=0; i<n; i++){result[i] = v;}return result;
}
console.log('泛型 Generics');
console.log(genArray(3, 'x')); // [ 'x', 'x', 'x' ]
console.log(genArray1<Number>(3, 100)); // 显示指定泛型类型 [ 100, 100, 100 ]
console.log(genArray1(3, true)); // 没有显示置顶 ts能类型推论 [ true, true, true ]// with Generics multi
function gen2<T, U> (a: [T, U]): Object{return {x: a[0],y: a[1] };
}
console.log(gen2(['abc', 123])); // { x: 'abc', y: 123 }

总结

  • 是什么: [预先不指定]具体类型,[使用时指定]类型
  • 定义: 函数名后定义泛型参数,
  • 使用: 函数入参和返回值使用泛型参数

声明合并 declaration merging

  • 是什么: 如果定义两个相同名字的函数、接口或类,那么它们会自动合并成一个类型
  • 合并类型: 函数合并、 接口合并、 类合并
// 1. 函数合并
function reverse(x: number): number;
function reverse(x: string): string;
function reverse(x: number | string): number | string | undefined {if (typeof x === 'number') {return Number(x.toString().split('').reverse().join(''));} else if (typeof x === 'string') {return x.split('').reverse().join('');}
}
// 个人理解 第3个reverse会覆盖前2个方法,调用时直接调用第3个reverse
console.log('reverse(123)=',reverse(123)) // reverse(123)= 321
console.log('reverse("abc")=',reverse("abc")) // reverse("abc")= cba// [关于函数重载]
function overload(a){console.log('一个参数')}
function overload(a,b){console.log('两个参数')}
// 在支持重载的编程语言中,比如 java
overload(1);   	  //一个参数
overload(1,2);    //两个参数
// ❗ 在 JavaScript 中,不同的参数都调用第2个方法
overload(1);     //两个参数 
overload(1,2);    //两个参数// 2. 接口合并 注意,合并的属性可以重复,但是重复属性的类型必须相同
interface Alarm {price: number;}
interface Alarm {weight: number;}
// 相当于  interface Alarm {price: number; weight: number;}
let fireAlarm1:Alarm = {price:1000} // error 
let fireAlarm2:Alarm = {weight:500} // error 
let fireAlarm3:Alarm = {price:1000,weight:500} // ok// 3. 类的合并 类的合并与接口的合并规则一致。

这篇关于从零开始学习typescript系列6: typescript各种类型以及类型特殊使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/834010

相关文章

如何使用celery进行异步处理和定时任务(django)

《如何使用celery进行异步处理和定时任务(django)》文章介绍了Celery的基本概念、安装方法、如何使用Celery进行异步任务处理以及如何设置定时任务,通过Celery,可以在Web应用中... 目录一、celery的作用二、安装celery三、使用celery 异步执行任务四、使用celery

使用Python绘制蛇年春节祝福艺术图

《使用Python绘制蛇年春节祝福艺术图》:本文主要介绍如何使用Python的Matplotlib库绘制一幅富有创意的“蛇年有福”艺术图,这幅图结合了数字,蛇形,花朵等装饰,需要的可以参考下... 目录1. 绘图的基本概念2. 准备工作3. 实现代码解析3.1 设置绘图画布3.2 绘制数字“2025”3.3

Jsoncpp的安装与使用方式

《Jsoncpp的安装与使用方式》JsonCpp是一个用于解析和生成JSON数据的C++库,它支持解析JSON文件或字符串到C++对象,以及将C++对象序列化回JSON格式,安装JsonCpp可以通过... 目录安装jsoncppJsoncpp的使用Value类构造函数检测保存的数据类型提取数据对json数

python使用watchdog实现文件资源监控

《python使用watchdog实现文件资源监控》watchdog支持跨平台文件资源监控,可以检测指定文件夹下文件及文件夹变动,下面我们来看看Python如何使用watchdog实现文件资源监控吧... python文件监控库watchdogs简介随着Python在各种应用领域中的广泛使用,其生态环境也

Python中构建终端应用界面利器Blessed模块的使用

《Python中构建终端应用界面利器Blessed模块的使用》Blessed库作为一个轻量级且功能强大的解决方案,开始在开发者中赢得口碑,今天,我们就一起来探索一下它是如何让终端UI开发变得轻松而高... 目录一、安装与配置:简单、快速、无障碍二、基本功能:从彩色文本到动态交互1. 显示基本内容2. 创建链

springboot整合 xxl-job及使用步骤

《springboot整合xxl-job及使用步骤》XXL-JOB是一个分布式任务调度平台,用于解决分布式系统中的任务调度和管理问题,文章详细介绍了XXL-JOB的架构,包括调度中心、执行器和Web... 目录一、xxl-job是什么二、使用步骤1. 下载并运行管理端代码2. 访问管理页面,确认是否启动成功

Mysql 中的多表连接和连接类型详解

《Mysql中的多表连接和连接类型详解》这篇文章详细介绍了MySQL中的多表连接及其各种类型,包括内连接、左连接、右连接、全外连接、自连接和交叉连接,通过这些连接方式,可以将分散在不同表中的相关数据... 目录什么是多表连接?1. 内连接(INNER JOIN)2. 左连接(LEFT JOIN 或 LEFT

使用Nginx来共享文件的详细教程

《使用Nginx来共享文件的详细教程》有时我们想共享电脑上的某些文件,一个比较方便的做法是,开一个HTTP服务,指向文件所在的目录,这次我们用nginx来实现这个需求,本文将通过代码示例一步步教你使用... 在本教程中,我们将向您展示如何使用开源 Web 服务器 Nginx 设置文件共享服务器步骤 0 —

Java中switch-case结构的使用方法举例详解

《Java中switch-case结构的使用方法举例详解》:本文主要介绍Java中switch-case结构使用的相关资料,switch-case结构是Java中处理多个分支条件的一种有效方式,它... 目录前言一、switch-case结构的基本语法二、使用示例三、注意事项四、总结前言对于Java初学者

Golang使用minio替代文件系统的实战教程

《Golang使用minio替代文件系统的实战教程》本文讨论项目开发中直接文件系统的限制或不足,接着介绍Minio对象存储的优势,同时给出Golang的实际示例代码,包括初始化客户端、读取minio对... 目录文件系统 vs Minio文件系统不足:对象存储:miniogolang连接Minio配置Min