一共26章,目前看到第7章,文档地址:https://blog.csdn.net/qq1195566313?type=blog
js基础类型:
Object, String, Number, Boolean, Null, undefined, bigInt, symbol
其中Object包括data,function,array等
symbol类型的对象永远不相等,即便创建的时候传入的值相同,因此可以用来解决属性名冲突的问题,作为标记
bigInt js中的任意精度整数,可以安全储存和操作大整数。即超出Number能够表示的安全
整数范围。
ts基础类型
npm i -g typescript 全局安装typescript
ts是js的超集,所以js基础的类型都包含在内
Object, Boolean, Number, String, null, undefined, symbol, bigInt
| 声明 |
|---|
| 普通声明: let a: string = ‘234’ 使用es6的字符串模板: let b: string something${a}普通数字:let c: number = 123; 无穷大:let d: number = Infinity; 十进制:let e:number = 6; 十六进制: let f: number = 0xf00d; D: 十进制 B:二进制 H:十六进制 O/Q:八进制 |
| 定义undefined: let u: void = undefined 定义null:let n: void = null - void 和 null 和 undefined 的最大区别: - undefined和null是所有类型的子类型,也就是undefined类型的变量,可以复制给string类型的变量 - 报错:let test: void = undefined; let num2: string = ‘1’; num2 = test; - 不报错: let test: null = null; let num2: string = ‘1’; num2 = test; - 不报错: let test: undefined = undefined; let num2: string = ‘1’; num2 = test; |
如果tsconfig.json 开启了严格模式:”compilerOptions”: { “strict”: true }
- 报错:null不能赋予void类型
|
| 使用构造函数 Boolean 创造的对象不是布尔对象:(报错)let b: boolean = new Boolean(1)
事实上new Boolean()返回的是一个Boolean对象:let bool: Boolean = new Boolean(2)
直接使用布尔值: let b1:boolean = true
通过函数返回布尔值:let b2:boolean = Boolean(1) |
| js没有空值的概念,ts中可以用void表示没有任何返回值的函数
function voidFun(): void {
console.log(‘test void’)
} |
任意类型
node环境支持的依赖必装:npm i -D @types/node
npm i ts-node —g
查看安装的插件:
- npm list -g -depth 1
- npm list
- 查看node_modules文件夹目录
- npm [name] -v[name]
- 例如:npm bluebird -v => 2.14.20
any:任意类型
let key:any = 123;
key = true;
key = ‘123’;
声明变量的时候灭有指定任意类型默认为any
let key;
key = true;
key = ‘123’;
如果使用any就是去了ts类型检测的作用
ts3.0引入的unknown类型也被认为是top type,但它更安全。与any一样,所有类型都可以分配给unknown。如果要使用any,可以用unkonw代替
let value:unknow;
value = true; value = 12; value = ‘hello’; value = null; value = undefined; value = Symbol[‘type’];
报错:let names:unknown = ‘123’;
unknow类型不能作为子类,只能作为父类型。any可以作为父类型也可以作为子类型
unknow类型不能复制给其他类型
正确:let name:any = ‘123’; let name2:string = name;
unknow 可复制对象只有unknow和any
- 如果是any类型在对象还没有这个属性的时候还在获取是不会报错的:
- let obj:any = { b:1 }; abj.a
- 如果是unknow,不能调用属性和方法
- let obj:unknow = { b:1, ccc:():number => 213 }
- obj.b
- obj.ccc()
- let obj:unknow = { b:1, ccc:():number => 213 }
- 编译:tsc app.ts
- tsc报错:此系统上禁止运行脚本
- 管理员运行vscode
- 终端执行:get-ExecutionPolicy,显示Restricted
- 终端执行:set-ExecutionPolicy RemoteSigned
- 终端执行:get-ExecutionPolicy,显示RemoteSigned
- tsc报错:此系统上禁止运行脚本
- 运行:node app.js
对象
定义对象要用关键字interface
申明变量的时候要定义对象的所有属性
interface Person {
b:string
a:string
}
报错:const p:Person = { a:’12’ }
重名interface可以合并
interface A{ a:string }
interface A{ b:string }
var x:A = { a:’1’,b:’2’ }
继承
interface B extends A { c:string }
var y:B = { a:’1’,b:’1’,c:’1’ }
可用?操作符,说明该属性可以不存在
interface Person{ a?:string,b:string }
不报错:var person:Person = { b:’something’ }
任意属性
interface Person{ a:string, [propName:string]:any }
var person:Person = { a:’me’, c:’whatever..’ }
只读属性readonly
只读属性不允许被赋值,只能读取
interface Person{ b?:string, readonly a:string, [propName: string]:any; }
var person:Person = { a:’qiuhaicong’,c:’lalalla’ }
console.log(person.a)
报错:person.a=’liu’
添加函数
interface Person {
b?:string,
readonly a:string,
[propName:string]: any,
foo():void
}
var person:Person = { a:’笨蛋’,foo:()=>{ console.log(‘lalala’) } }
数组
- 类型中加中括号:let arr:string[] = [‘1’]
- 定义了字符串类型出现数字是不允许的
- 报错:let arr:string[] = [‘1’,2]
- 报错:arr.push(34)
- 任意类型的数组:let list:any[] = [ ‘test’,1,[],{a:2} ]
其他
- 数组泛型
- let arr:Array
= [ 2,3 ]
- let arr:Array
- 接口数组
- interface NumberArray{ [ index:number ]:number }
- let arr:NumberArray = [ 1,2,4 ]
- 多维数组
- let data:number[][] = [[1,2],[2]]
arguments类数组
参数不能多传也不能少传,必须按照约定的类型
- const fn = (name:string, age:number):string =>{ return name+age }
- fn(‘李少云’,23)
- 可选参数
- const fn = (name:string,age?:number):string => { return name + age }
- fn(‘张三’)
- 接口定义函数
- interface Add { (num:number,num1?:number,num2?:number):number }
- const fn:Add = num:number,num1?:number,num2?:number):number =>{ return num+num1+(num2||0) }
- interface Add { (num:number,num1?:number,num2?:number):number }
- 定义剩余参数
- const fn ( array:number[], …items:[any] ):any[] =>{ return items }
函数重载
联合类型
- let phone: string | number = ‘010-820’
- 类型断言
- interface A { run:string }
- interface B { build:string }
- const fn = (type:A | B):string =>{ return (type as A).run }
- 类型断言只能欺骗ts编译器,无法避免运行时的错误,反而滥用类型断言可能会导致运行时错误
- any临时断言
- 报错:window.abc = 123 因为window没有abc这个变量
- (window as any).abc = 123; 使用any临时断言在any类型的变量上,访问任何属性都是允许的
