# ts 学习
# 静态类型语言 vs 动态类型语言
# 使用 ts
- 1 npm i typescript -g 全局安装 ts
- 2 tsc --init 创建 tsconfig.json 文件。
//原始数据类型
let bool:boolean = true
let num:number = 123
let str:string = "123"
let test:string|number = '123'//联合类型
//元组 不能改变数据类型和个数
let tuple:[number,string] = [1,'2']
tuple.push(3)
//虽然元组可以往里push元素,但是在实际的开发过程中是不建议这么操作的,并且push进去的值 不允许访问。
console.log(tuple) //打印结果[1,'2',3]
tuple[2] // 报错 push进去的值不允许访问
//枚举
enum USER_INFO{
USER_NAME = "zhangsan",
USER_AGE = 14
}
// interface 用来描述对象形状
let company:Company = {
name: 'zhangsan',
address: "beijing",
num: 10,
}
interface Group extends Company{
groupName:'',
groupNum:13
}
let group:Group = {
groupName: "",
groupNum: 13,
name: "",
address: "",
num: 0
}
let group:Group = {
groupName: "",
groupNum: 13,
name: "",
address: "",
num: 0,
money:1000
}
//type是类型一般在定义联合类型或者定义类型的别名
interface Group{
name:'111'
}
//type实现继承
type Info = Group & {
age:20
}
- let arr1:number[] = [1,2,3]
- let arr2:Array<number|string> = [1,2,'3']
//函数 let add = (x:number,y:number) number =x +y
//对象 let obj:object = {x:1,y:2} let obj:{x:number,y:number} = {x:1,y:2}
//symbol let s1:symbol = Symbol() let s2 = Symbol() console.log(s1 === s2 ) //false
//underfind,null let test1:unserfind = underfind let test2:null = null
//never 类型
let error =()=>{ throw new Error('error') }
let endless = ()=>{ //死循环 never 类型 while(true){
} }
# ES6 数据类型
- Boolean Number String Array Function Object Symbal underfind null
# TS 数据类型
- Boolean Number String Array Function Object Symbal underfind null
- void any never 元祖 枚举 高级类型
# 类的概念
class Dog{
name: string;
constructor(name:string){
this.name = name;
}
run(){
}
}
let dog = new Dog('kira')
console.log(Dog.prototype) //打印类的原型
//{run: ƒ, constructor: ƒ}
console.log(dog)//打印类的实例,发现属性挂在实例上。
//Dog {name: "kira"}
# 类成员修饰符
- public 默认
- private
- static
- readonly
- protected
# private 特性
- 1 private 定义的变量,只能通过 Dog 类访问
- 2 实例不能访问 private 修饰的变量
- 3 子类 super 不能调用父类 private 修饰的变量
- 4 如果用 private 修饰 constructor 该类既不能被继承 也不能被实例化。
class Dog{
private name: string;
constructor(name:string){
this.name = name;
}
run(){
console.log('run=====')
}
}
console.log(Dog.name);//正常
console.log(dog.name);//
//Property 'name' is private and only accessible within class 'Dog'.
class TT extends Dog{
color:string
constructor(name:string,color:string){
super(name)
this.color = color;
}
getColor(){
super.name//报错
return this.color;
}
}
# protected 特性
- protected 受保护的,受保护的成员只能在类中或者子类中访问,不能在实例中访问。
- protected 修饰 constructor,表示该类不能被实例化,只能被继承。
class Dog{
protected name: string;
constructor(name:string){
this.name = name;
}
run(){
console.log('run=====')
}
}
let dog = new Dog('kira')
console.log('dog',Dog.name) // 正常访问
console.log('dog',dog.name) // 报错,protected成员不能在实例中访问
class TT extends Dog{
color:string
constructor(name:string,color:string){
super(name)//子类可以正常访问受保护成员
this.color = color;
}
getColor(){
return this.color;
}
}
# readonly 特性
- 1 必须被初始化
- 2 只读不能被修改
# static 特性
- 静态成员 可以被继承
- 静态成员 只能通过类名调用
- 实例对象 不能调用到静态成员
class Dog{
static test: string = ''; //静态成员
constructor(){
}
run(){
console.log('run=====')
}
}
let dog = new Dog()
console.log('dog',Dog.test) //可以调用
console.log('dog',dog.test) //实例不可以调用 会报错。
class TT extends Dog{
color:string
constructor(name:string,color:string){
super()
console.log(super.test) //不可以调用
console.log(TT.test) // 可以通过子类调用
this.color = color;
}
getColor(){
return this.color;
}
}