美文网首页
初探 TypeScript(一)TypeScript 数据类型

初探 TypeScript(一)TypeScript 数据类型

作者: StevenTang | 来源:发表于2021-01-30 18:00 被阅读0次

介绍 TypeScript

  • TypeScript 是 JavaScript 的一个超集,支持 ECMAScript 6 标准(ES6 教程)。
  • TypeScript 由微软开发的自由和开源的编程语言。
  • TypeScript 设计目标是开发大型应用,它可以编译成纯 JavaScript,编译出来的 JavaScript 可以运行在任何浏览器上。

TypeScript 数据类型

TypeScript 基本数据类型

TypeScript 对比 JavaScript 来讲是一门强类型语言吗,不能更改原有的类型

例如在 JavaScript 中

let a = '1';

a = 1;

console.log(a); // 10

在上面的代码中,我们可以看到 a 刚开始是 String 类型,后面赋值 10 变成了 Number 类型

在 TypeScript 中

let a = '1';

a = 1; // Type '1' is not assignable to type 'string'

因为强类型语言是一种强制类型定义的语言,所以一开始 a的值 string 后面就不能赋上其它类型的值

在 TypeScript 也可以这样子来定义变量

let a: string = '1';

这个叫做 typeScript 的原型,其他原型

let a: string = '1';
let num: number = 1;
let ifLogin: boolean = false;
......

// 一种特殊的类型
let anything;
anything = 1;
anything = '1';

可以不对当前值做初始化,此时变量可以被赋值为任意值。等同于:


let anything: any;

any 类型可以存储任何类型的值

TypeScript 数组、元组、枚举

数组

在 TypeScript 中数组的原型写法


let name: Array<string> = ['a','b']

前面的 Array 是 name 这个变量的值的类型,<>里面是数组里面的值的类型。


let name: Array<string> = ['a','b']

console.log(name[0]);

转换成 js 在浏览器打印出 console.log(name[0]) 打印出 a


let name: Array<string> = ['a','b']

name[0] = 100;

报错 Type '100' is not assignable to type 'string'


let name: Array<string> = ['a','b']

name[0] = '100';

name = 'a'; // 报错

name = ['100']; // 没问题

name = [100] // 报错

因为在初始化变量 name 的时候就定义好了是 array 类型,数组里面值的类型是 string。

多种初始化数组变量,定义数组变量也可以这样写:


let numbers: Array<number> = [1, 2, 3];

let numbers: number[] = [1, 2, 3];

let anyArray: any[] = [1, '2', false];

元组

可以在数组里面设置多个类型值


let box: [string, number] = ['hello', 2];

枚举

enum Color{
    Black,
    Yellow,
    Red
}

let myColor: Color = Color.Red;

console.log(myColor); // 输出 3

枚举是存的数值,而不是打印出属性 Red

函数的相关类型

返回值的类型


function returnVal():string{
    return 'hahaha';
}
console.log(returnVal())

打印出 hahaha


function returnVal():string{
    return 100;
}
console.log(returnVal()) 

打印报错

function say():viod {
    console.log('hahaha');
}

参数返回值


function box(val1,val2){
    return val1+val2
}

box(1, '2');    // 输出 '12';

// 等同于

function box(val1:any, val2:any){
    return val1 + val2
}

box(1, '2');    // 输出 '12';

// 可以定义类型

function box(val1:number, val2:number){
    return val1 + val2
}

box(1, 2);      // 输出 3

box(1, '2');    //报错

设置返回值类型

function box(val1:number, val2:number):number{
    return val1 * val2
}

box(1, 2);      // 输出 3

函数类型

function say():viod {
    console.log('hahaha');
}
function box(val1:number, val2:number){
    return val1 + val2
}

let myfunc;

myfunc = say;
myfunc();       // 输出 hahaha

myfunc = box;
myfunc(5, 5);   // 输出 10

这里的 myfunc 是 viod 类型,可以存储不同的函数


function say():viod {
    console.log('hahaha');
}
function box(val1:number, val2:number){
    return val1 + val2
}

let myfunc: (a: number,b:number) => number; // 给函数、返回值指定类型

myfunc = say;   // 报错
myfunc();       // 报错

myfunc = box;
myfunc(5, 5);   // 输出 10

TypeScript 对象类型和 type

object


let obj = {
    name: "cheng",
    age: 20
};

obj = {}        // 报错 

// 因为初始化的时候已经给 obj 这个对象设置了属性和属性值类型

obj = {
    a: 'cheng',
    b: 20
}               // 报错             

// 因为初始化的时候已经给 obj 设置格式, 包含了 name,age 所以在 obj 里面要有 name 和 age

完整写法

let obj:{name: string, age: number} = {
    name: "cheng",
    age: 20
};

obj = {
    name: 'wu',
    age: 18
} 

修改正确

复杂对象类型


let comp: {data: number[], myfunc:(itme: number)=> number[]} = {
    data: [1, 2, 3],
    myfunc: function(itme: number):number[]{
        this.data.push(itme);
        return this.data;
    }
};

console.log(comp.myfunc(20)); // 输出 [1, 2, 3, 20]

type 生成类型


type IType = {data: number[], myfunc:(itme: number)=> number[]};

let comp: IType = {
    data: [1, 2, 3],
    myfunc: function(itme: number):number[]{
        this.data.push(itme);
        return this.data;
    }
};
console.log(comp.myfunc(10)); // 输出 [1, 2, 3, 10]

union type、检查类型 、null undefined 、never

union type


let unionType:any = 12;

unionType = '12';

let a:number| string| boolean = 12;

a = '12';
a = true;
a = {}; // 报错

检查类型


let checkType = 10;

if(typeof checkType == "number"){
    console.log('number');
}

null & undefined


let a = null;
a = undefined;

let myNull = 12;
// 可以在非严格模式下设置,不报错
myNull = null;

never

never 类型是任何类型的值类型,也可以赋值给任何类型。然而没有类型是 never 的子类型或可以赋值给 never 类型(除了 never 本身之外)。any 也不可以赋值给 never。通常表现为抛出异常或无法执行到终止点(例如无线循环)。

let x:never;
x = 12; // 报错: 不能将其他类型转为 never 类型

let y: number;

y = (()=>{
    throw new Error(msg)
})();

可以正常执行

never 的应用场景

抛出异常
function error (msg: string):never {
    throw new Error(msg)
}
死循环
function loop():never{
    while (true){}
}

练习


let sumVal = {
    money: 200,
    count(val){
        this.money += val
    }
};

let handleCount = {
    name: 'Henry',
    sumVal: sumVal,
    friends: ['wu', 'chen']
}

handleCount.sumVal.count(500);
console.log(handleCount);

答案


type sumVal = {money:number, count:(val:number)=> number}

let sumVal:sumVal = {
    money: 200,
    count(val:number):number{
        this.money += val
    }
};

let handleCount:{name:string,sumVal:sumVal}, friends:array<string>} = {
    name: 'Henry',
    sumVal: sumVal,
    friends: ['wu', 'chen']
}

handleCount.sumVal.count(500);
console.log(handleCount);

相关文章

网友评论

      本文标题:初探 TypeScript(一)TypeScript 数据类型

      本文链接:https://www.haomeiwen.com/subject/qyhtzktx.html