TS 类型的声明
// 声明一个变量a, a的类型只能是number类型(如果是其他类型会报错)
let a: number
// 声明后的变量可以直接赋值
let b: string = "123"
// 直接进行变量的赋值,ts 会自动进行判断声明(这里的 c = 123 会报错,因为会自动判断c 的类型为boolean)
let c = true
c = 123
// ts 中也可以对函数进行类型的声明(声明函数的参数a,b为number,且只有2个参数,函数的返回类型也是number,三者有一个不符合都会报错)
function sum(a:number, b:number):number{
return a + b
}
TS 类型
基本类型
这里的基本类型就和上面所述的 string number的基本类型声明一样
字面量
// 声明一个变量a a的值只能为10,类似声明一个常量
let a:10
|
// 声明一个变量b b的值可以是number也可以是string
let b:number | string
any
// 声明一个变量c c的值可以是任何类型(声明为该类型表示跳过ts的类型检测)
let c:any
// 如果给一个变量没有复制那么ts将自动解析该变量为 any 类型
let d;
unknow
// 声明一个变量e,e的值是未知的(unknow 与 any 不同的是 any可以直接赋值给任何类型的变量,但是unknow 类型不可以)
let e:unknow
let s:string
s = c; //正确
s = e; //错误
类型断言 as
let e:unknow
e = 'hello'
let s:string
// 报错,因为 unknow 类型不可以直接赋值
s = e
// 正确,表示e就是一个string类型的变量不需要进行检查了
s = e as string
s = <string>e
void
// 用表示一个函数的返回值为空 可以返回null和undefeated
function sum():void{
}
never
// 用表示一个函数不会返回任何结果
function sum():never{
throw new Error("函数报错")
}
object
// 语法:{属性名:属性值,属性名:属性值}
// 属性名后面加?表示该属性是可选的
let a: {name:string, age?:number}
// 表示该对象只有一个name属性是必须的。
let b:{name:string, [propName:string]:any}
// 于此相同的是function
let c:(a:number,b:number)=>number
array
// 语法:类型[]
// <Array>类型
let d: number[]
let e: <Array>string
元组
// 表示固定长度的数组
// 语法:[类型,类型,类型]
let a: [string,number,string]
a = ["123",123,"456"]
enum 枚举
// 当一个值的范围是在多个值之间选择的时候适合用枚举类型
enum Gender{
male = 1,
female = 0
}
let person:{name:string ,gender:Gender}
person = {
name:"xiaoming",
gender:Gender.male
}
类型别名
type myType = 1 | 2 | 3
let a:myType;
a = 1 // true
a = 4 // false
类
/*
1. 使用 classs 关键字来声明一个类
2. 类中主要包含2个部分,一个属性,一个是方法
*/
class Person{
/*
属性分为实例属性和静态属性
实例属性需要通过实例对象去调用
let p = new Person()
p.name
静态属性只能通过类去访问
Person.name
当然还其他属性如:readonly 只读属性等
*/
name:string = "xiaoming";
age:number = 3;
// 方法同属性
sayHello(){
console.log("hello")
}
}
/*
在我们实际使用过程中一般不希望我们的属性值是一个固定值,而是更具不同的实例对象获取不同的值
*/
class Person{
name:string;
age:number;
// 构造函数会在对象的创建时期调用,应此我们一个在实例化该类的时候赋值
constructor(name:string,age:number){
// 这里的this知道实例对象
this.name = name;
this.age = age;
}
sayHello(){
console.log("hello")
}
}
let p = new Person(name:'xiaoming',age:8);
继承 extends
使用extends 关键字实现对一个类的继承,子类可以使用父类的方法和属性,但是需要注意的是,子类中出现和父类相同的方法会对父类的方法进行覆盖,当子类需要添加一个属性时,需要在构造函数中使用super()实现对父类的引用。
class Person{
public name: string; // 写或什么都不写都是public
public age: number;
constructor(name: string, age: number){
this.name = name; // 可以在类中修改
this.age = age;
}
sayHello(){
console.log(`大家好,我是${this.name}`);
}
}
class Employee extends Person{
constructor(name: string, age: number){
super(name, age);
this.name = name; //子类中可以修改
}
}
接口 interface
接口用来定义一个类的结构,用来规定实现的这个类需要包含哪些属性和方法,同时接口也可以用来当成类型声明去使用(但是接口可以去重复声明,重复声明时相当于合并)。
interface FullName{
firstName:string;
lastNae:string;
}
function sayName(name:FullName){
console.log(name.firstName+"--"name.lastName)
}