初探 TypeScript(一)TypeScript 数据类型

介绍 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);

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,524评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,869评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,813评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,210评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,085评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,117评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,533评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,219评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,487评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,582评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,362评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,218评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,589评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,899评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,176评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,503评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,707评论 2 335

推荐阅读更多精彩内容