在正式开篇之前,小伙伴们应该要弄清两个概念 : 强类型与弱类型,也就是强类型语言和弱类型语言。
-
强类型语言 : 指的是在定义变量时需要强制定义类型的语言。通俗的讲就是你在定义变量的时候必须要先定义完类型才能使用。
强类型语言代表 : Java 、.NET 、 C++ 、 Typescript
注意 : 强类型语言当中变量一旦被定义为某种数据类型之后,便不可以轻易将其他类型的值赋予它。
-
弱类型语言 : 指的是数据类型可以被忽略,一个变量允许赋予不同类型的值。也就是说你给它什么类型的值,它就是什么类型的变量。
弱类型语言代表 : vb 、 php 、 javascript
强类型与弱类型的比较 :
- 弱类型语言开发及其便利,开发者可以将注意力集中在业务处理和逻辑开发上。
- 强类型语言的内存利用率上明显高于弱类型语言。
- 随着项目的壮大,弱类型语言对变量类型检测力度不足,势必会在提高数据类型方面出现问题。
顺便提下静态类型和动态类型吧:
- 静态类型指的是变量的类型在编译阶段就确定的语言
- 动态类型指的是变量的类型在运行时才确定
显然JavaScript是一个动态弱类型语言。
Typescript变量声明
-
方式 : 与javascript一样,声明变量有三种方式 var let const
-
命名规则 :
变量名称可以包含字母和数字
除了下划线_和美元$符号外,不能包含其他的特殊符号,包括空格。
变量名不能以数字开头。
-
声明变量的类型和初始值 :
let 变量名 : 类型 = 值 ;
let name : string = "buzhanhua"; -
声明变量的类型但没有赋予初始值,变量值默认是undefined
let 变量名 : 类型;
let name : string; console.log(name) // undefined
Typescript 的基本类型
- 布尔类型 (boolean)
- 数字类型 (number)
- 字符串类型(string)
- 数组类型(array)
- 元组类型(tuple)
- 枚举类型(enum)
- 任意值类型(any)
- null和undefined
- void类型
- never类型
布尔类型 (boolean)
boolean 用于最直接的逻辑处理,只有两种值 : true 和 false
let bool : boolean = true ;
console.log(bool) // true
数字类型 (number)
与javascript一样 , Typescript 里的所有数字都是number类型,在这里不区分整数和小数。
let num : number = 12;
let numFloat : number = 1.022;
console.log(num,numFloat) // 12 , 1.022
字符串类型(string)
和javascript 一样, 可以使用单引号('') 和双引号 ("")表示字符串。
let str :string = "你好吗 ?";
let str2 : string = '我还好 ? 拉我起来我还能学。。。';
console.log(str,str2)// 你好吗 ? 我还好 ? 拉我起来我还能学。。。
当然你还可以使用字符串模板 ``
let age : number = 16;
let my : string = `嗨,处对象吗 ?我今年${age}`;
console.log(my)//嗨,处对象吗 ?我今年16
上面的都是基本数据类型的字符串,数据类型是string,你还可以创建引用类型的字符串:
let str : String = new String('buzhanhua')
// 这样创建出来的是一个对象,类型判断不再是string类型了
数组类型 (array)
在类型后面接上 [] ,表示数组 :
let arr : number[] = [1,2,3,4,5];
let arr2 : Array<string> = new Array('bu','zhan','hua');
// 这是两种声明数组的方式
以上示例要求数组的成员必须是number类型 , 如果含有其他类型的则会报错。
元组类型 (tuple)
元组类型可以用于表示元素类型不同的数组。但是前提是你要知道数组成员的数量和类型。
let tupleArr : [string,number,boolean] = ["你好啊",1,true];
console.log(tupleArr);// ["你好啊", 2, true]
注意 : 相对应值的类型一定要相同,数量一定相同,否则报错。
任意值类型 (any)
any类型可以表示任意类型,当你的数据类型不确定时,或者数组中只知道部分元素类型的时候,你就可以使用它了。不指定数组类型时,默认就是any.
let anyArr : any[] = [1,'2',true,undefined];
console.log(anyArr);// [1, "2", true, undefined]
null和undefined
你可以将null和undefined赋值给任意类型的变量,是所有类型的子类型,比如string :
let str : string = null;
console.log(str)// null
void类型
void类型表示没有任何类型。声明一个void类型的变量是没有任何意义的,因为它的值只能是undefined和null :
let a : void = null;
let b : void = undefined;
void类型主要用于当函数没有返回值的时候,将返回值类型定义为void类型。以下代码的意思是fn函数无返回值,若又返回了则会报错 :
function fn():void{
console.log("heihei")
}
枚举类型 (enum)
枚举:一组有名字的常量集合。是只读的
使用枚举类型我们可以对一个有固定种类但是每个类型的值不同的变量进行描述,比如:一个比赛的结果有三种,输、赢、平,描述这个结果就可以使用枚举类型进行描述。
Typescript 支持数字和基于字符串的枚举。
-
数字枚举
enum Color { red = 1, green, blue }如上,我们定义了一个数字枚举 , red 使用初始化为1, 其余成员会从1开始自增长 。 也就是 green 为2 , blue为3。
enum Color { red , green, blue }我们也可以不使用初始化器,这样red 则默认初始化为 0
对于数字枚举使用很简单 : 通过访问枚举属性可以获取对应的值,通过值也可以获取对应的枚举属性名字
enum Color { red = 1, green, blue } let color : number = Color.red; // color 为 1 let colorName : string = Color[2] // colorName 是green -
字符串枚举
enum Color { red = 'RED', green = 'GREEN', blue = 'blue' } let red : string = Color.red // red 为 RED
never 类型
never类型表示的是那些永不存在的值的类型。 例如, never类型是那些总是会抛出异常或根本就不会有返回值的函数表达式或箭头函数表达式的返回值类型; 变量也可能是 never类型,当它们被永不为真的类型保护所约束时。
function add(): never{
throw new Error();
}
object 类型
object表示非原始类型,也就是除number,string,boolean,symbol,null或undefined之外的类型。
let obj : object = {
name : 'buzhanhau'
}
console.log(obj["name") // buzhanhau
注意 在typescript 中对象属性取值时 , 要用 obj["属性名"]的方式去取值, 用obj.属性名则会报找不到属性的错误
TypeScript提供了一些引用类型,如 Array 、 String、Date 、RegExp 等
这些东西的使用方式,和JavaScript相同,老话重谈,特殊的地方也就在于增加了静态类型
自动类型推断
TS存在自动类型推断
let num = 1;
num = '2' // 报错
因为ts默认给num添加了number类型。
联合类型
let x : number | string | null ;
x = 1
x = 'a'
x = null
Symbol
ES5的对象属性名都是字符串,这容易造成属性名的冲突。比如,你使用了一个他人提供的对象,但又想为这个对象添加新的方法(mixin模式),新方法的名字就有可能与现有方法产生冲突。如果有一种机制,保证每个属性的名字都是独一无二的就好了,这样就从根本上防止属性名的冲突。这就是ES6引入Symbol的原因。
ES6引入了一种新的原始数据类型Symbol,表示独一无二的值。它是JavaScript语言的第七种数据类型,前六种是:Undefined、Null、布尔值(Boolean)、字符串(String)、数值(Number)、对象(Object)。
var sym= Symbol();
let obj = {
[sym]: 'value'
}
console.log(obj[sym])
// ts这么写会报错
let sym = Symbol();
class C {
[sym]():string{
return 'hello'
}
}
let c: C = new C();
console.log(c[sym]()) // 'hello'