2、typescript中的数据类型

3 年前 · 来自专栏 typescript从理论到实战

typescript中包含了 es6 中的所有数据类型 Boolean 、 Number 、 String 、 Array、Function、Object、Symbol、undefined、null。除此以外,还有 void、any、never、元组、枚举 这几个独有的数据类型


布尔值 - boolean

let isDone: boolean = false;

数字 - number

let decLiteral: number = 6;           // 十进制 
let hexLiteral: number = 0xf00d;      // 十六进制 
let binaryLiteral: number = 0b1010;   // 二进制 
let octalLiteral: number = 0o744;     // 八进制


字符串 - string

let str1: string = 'hello';              // 单引号  
let str2: string = "world";              // 双引号  
let str: string = `${str1} ${str2} !`;   // 摸板字符串


数组 - Array

// 定义方式一:type[],表示由此类型元素组成的一个数组
let list: number[] = [1, 2, 3];
// 定义方式二:Array<type>,使用数组泛型
let result: Array<number> = [1, 2, 3];
// 数组一旦在定义时指定了数据类型,就不能添加其它的数据类型
list.push('hello');   // 类型“"hello"”的参数不能赋给类型“number”的参数
// 如果想要一个数组接收两种数据类型,可以这么做
let data: Array<number | string> = [1, 'hello', 2, 'world'];


元组 - Tuple

元组类型表示一个 已知元素数量和类型 数组 ,准确的说,是已知数组中的每一个位置上的元素类型。为元组类型赋值时,各个位置上的元素类型都要对应,元素个数也要一致

let tuple: [string, number] = ['Bob', 23];
tuple = ['Bob', 'Chirs'];    // 不能将类型“string”分配给类型“number”
tuple = [23, 32];            // 不能将类型“number”分配给类型“string”
tuple = ['Bob', 23, 32];     // 不能将类型“[string, number, number]”分配给类型“[string, number]”


强烈不建议像数组一样添加、删除和修改元组的元素

 let tuple: [number, string] = [0, '1'];
tuple.push(1);
console.log('tuple', tuple);     // tuple [ 0, '1', 1 ]
// 试图读取越界元素时,还是会报错
tuple[2];  // Tuple type '[number, string]' of length '2' has no element at index '2'


函数

let add = (x: number, y: number): number => x + y
// 根据函数的类型推断功能,可以简写为
let add = (x: number, y: number) => x + y
// 定义函数类型
let getResult: (x: number, y: number) => number
// 实现函数(参数名不必相同,也无需指出参数类型、函数返回值)
getResult = (a, b) => a + b


对象

let obj: {name: string, age: number} = {
  name: 'Bob',
  age: 23
obj.age = 30;
console.log('obj', obj);     // obj { name: 'Bob', age: 30 }
// 如果不具体指出对象的参数类型,则无法修改对象的属性
let map: object = {x: 1, y: 2};
map.x = 22;    // 类型“object”上不存在属性“x”
let map: {x: number, age: y}= {x: 1, y: 2};
map.x = 22; //这时候x是可以修改的


Symbol

具有唯一的值

// symbol 类型的值是通过 Symbol 构造函数创建的
 let s1: symbol = Symbol();
 let s2 = Symbol();  
console.log(s1 === s2);   // false, symbols是唯一的

undefined 和 null

如果一个变量被初始化为 undefined 或 null,就不能再赋值其它数据类型

 let un: undefined = undefined;
let nu:null=null;  
un =12;// 不能将类型“12”分配给类型“undefined” 
nu = 34;  // 不能将类型“34”分配给类型“null”


默认情况下, undefined 和 null 是所有类型的子类型 ,也就是说可以把 undefined 和 null 赋值给 number、string 等类型的变量

let num: number = 23;
num = undefined;
let str: string = 'hello';
str = null;
let bool: boolean = false;
bool = undefined;



void

void 是一种操作符,表示没有任何返回值的类型,它可以让任意一个表达式返回undefined

function warnUser(): void {
    alert("This is my warning message");


any

如果不指定一个变量的类型,则默认就是any类型

let x;
x = 1;
x = {};
x = () => {}


never

never表示永远不会有返回值的类型,有两种情况:

  1. 函数抛出异常
  2. 死循环
let error = () => {
    throw new Error('error')