2、数据类型
typescript中为了使编写的代码更规范,更有利于维护,增加了类型校验,在typescript中主要给我们提供了以下数据类型
- 布尔类型(boolean)
- 数字类型(number)
- 字符串类型(string)
- 数组类型(array)
- 元组类型(tuple)
- 任意类型(any)
- null 和 undefined
- void类型
- never类型
类型定义
ts规定定义变量时必须制定类型:
let flag:boolean = true; flag = 123; //报错
定义字符串、数字类型与上面的一样
定义数组类型
第一种:
let arr:number[] = [1,2,3,4]; //定义数字类型的数组 console.log(arr); //[1,2,3,4] let arr1:{id:number,name:string}[] = [ //定义对象类型数组 {id:1,name:'Mike'} ]
第二种(数组泛型):
let arr:Array<number> = [1,2,3,4]; //定义数字类型的数组 console.log(arr); //[1,2,3,4]
第三种(用接口表示数组):
interface NumberArray { [index: number]: number; } let fibonacci: NumberArray = [1, 1, 2, 3, 5];
NumberArray
表示:只要索引的类型是数字时,那么值的类型必须是数字。这种方式定义起来比较麻烦,所以不常用。
元组类型
数组合并了相同类型的对象,而元组(Tuple)合并了不同类型的对象。
定义一对值分别为 string
和 number
的元组:
let tom: [string, number] = ['Tom', 25];
当赋值或访问一个已知索引的元素时,会得到正确的类型:
let tom: [string, number]; tom[0] = 'Tom'; tom[1] = 25; tom[0].slice(1); tom[1].toFixed(2);
也可以只赋值其中一项:
let tom: [string, number]; tom[0] = 'Tom';
但是当直接对元组类型的变量进行初始化或者赋值的时候,需要提供所有元组类型中指定的项。
let tom: [string, number]; tom = ['Tom']; // Property '1' is missing in type '[string]' but required in type '[string, number]'.
枚举类型
enum
类型是对JavaScript标准数据类型的一个补充。 像C#等其它语言一样,使用枚举类型可以为一组数值赋予友好的名字。
enum Color {Red, Green, Blue} let c: Color = Color.Green;
默认情况下,从0
开始为元素编号。 你也可以手动的指定成员的数值。
enum Color {'Red' = 1, Green=2, Blue} let c: Color = Color.Red; //1 let c: Color = Color.Green; console.log(c); //2
//定义 enum 枚举名{ 标识符[=整型常数], 标识符[=整型常数], ..... 标识符[=整型常数], };
任意类型
任意值(Any)用来表示允许赋值为任意类型。
var oBox:any = document.getElementById('box'); oBox.style.color = 'red';
变量如果在声明的时候,未指定其类型,那么它会被识别为任意值类型
null和undefined
var num:undefined; console.log(num); //undefined //定义多个类型 var num:number | undefined | null; num = 123; console.log(num); //123
void类型
typescript
中表示没有任何类型,一般用于定义方法的时候没有返回值。
function run():void{ console.log('run'); } run();
如果一个方法的返回值为数字,可以改为
function run():number{}
never类型
never类型是其他类型(包括null
和undefined
的子类型,表示的是那些永不存在的值的类型。
never
类型是任何类型的子类型,也可以赋值给任何类型;但是没有任何类型可以赋值给never类型
(除了never
本身之外)
对象的类型 -- 接口
在typescript
中,我们使用接口(interface
)来定义对象的类型。
interface Person { name: string; age: number; } let tom: Person = { name: 'Tom', age: 25 };
Person
接口约束了tom
对象,tom
对象里的属性必须和接口中的保持一致
可选属性
加个?
号表示可选属性
interface Person { name: string; age?: number; //可选属性 } let tom: Person = { name: 'Tom' };
任意属性
有时候我们希望一个接口允许有任意的属性,可以使用如下方式:
interface Person { name: string; age?: number; [propName: string]: any; } let tom: Person = { name: 'Tom', gender: 'male' };
使用
[propName: string]
定义了任意属性取string
类型的值。需要注意的是,一旦定义了任意属性,那么确定属性和可选属性的类型都必须是它的类型的子集
只读属性
有时候我们希望对象中的一些字段只能在创建的时候被赋值,那么可以用 readonly
定义只读属性:
interface Person { readonly id: number; name: string; age?: number; [propName: string]: any; } let tom: Person = { id: 89757, name: 'Tom', gender: 'male' }; tom.id = 9527; //报错
注意,只读的约束存在于第一次给对象赋值的时候,而不是第一次给只读属性赋值的时候
联合类型
联合类型(Union Types)表示取值可以为多种类型中的一种。联合类型使用 |
分隔每个类型。
let myFavoriteNumber: string | number; myFavoriteNumber = 'seven'; myFavoriteNumber = 7;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律