2、数据类型

类型注解

let age: number = 18;

基础类型

可以将 TS 中的常用基础类型细分为两类:

原始类型

let age: number = 18;
let msg: string = "Hello World";
let isSuccess: boolean = false;

数组类型

let names: string[] = ['tom','lucy','james']
let ages: Array[number] = [18,20,35]
let arr = new Array<string>(5)

推荐string[]的写法

联合类型

数组中既有 number 类型,又有 string 类型;或者一个变量既可以赋string值,又可以赋number值。

|(竖线)在 TS 中叫做联合类型(由两个或多个其他类型组成的类型,表示可以是这些类型中的任意一种)。

let msgs:(string | number)[] = [18,'tom',25,30]
console.log(msgs)


let msg:(string | number) = 18
console.log(msg)
msg = 'hello'
console.log(msg)

类型别名

type MyType1 = number

type MyType2 = number | string

let msg1: MyType1 = 18
console.log(msg1)

let msg2: MyType2 = 20
console.log(msg2)
msg2 = 'hello'
console.log(msg2)

函数类型

function myFunc(num1: number,num2: number): number {
    return num1 + num2;
}

console.log(myFunc(1,2))

lambda表达式形式

let myFunc = (num1: number,num2: number): number => {
    return num1 + num2
}

console.log(myFunc(1,2))

无返回值,void可写可不写

function myFunc(msg: string){
    console.log(msg)
}
myFunc('Hello World')


function myFunc(msg: string): void{
    console.log(msg)
}
myFunc('Hello World')

可选参数,可选参数只能出现在参数列表的最后。

function myFunc(msg: string,info1?: string,info2?: string){
    console.log(msg,info1,info2)
}

myFunc('Hello') // Hello undefined undefined
myFunc('Hello','Tom') // Hello Tom undefined
myFunc('Hello','Tom',"Lucy") // Hello Tom Lucy

对象类型

// 声明对象类型
type Person = {
    name: string
    age: number
    info(): void
}
// 类型赋值
var tom: Person = {
    name: 'tom',
    age: 18,
    info: function() {
        console.log('my name is',this.name)
    }
}

tom.info()

可选属性的语法与函数可选参数的语法一致,都使用 ? (问号)来表示。

type Person = {
    name: string
    age?: number
    info(): void
}

var tom: Person = {
    name: 'tom',
    info: function() {
        console.log('my name is',this.name)
    }
}

tom.info()

接口

当一个对象类型被多次使用时,一般会使用 接口 ( interface )来描述对象的类型,达到复用的目的。接口中的属性同样也可以声明为可选。

interface Person {
    name: string
    age?: number
    info(): void
}

var tom: Person = {
    name: 'tom',
    info: function() {
        console.log('my name is',this.name)
    }
}

tom.info()

接口继承

如果两个接口之间有相同的属性或方法,可以将公共的属性或方法抽离出来,通过继承来实现复用 。

interface Animal{
    color: string
    name: string
}

interface Dog extends Animal{
    age: number
}

var wangcai: Dog = {
    name: 'wangcai',
    color: 'red',
    age: 18
}

console.log(wangcai)

可变key数量的接口

interface demo { 
    [name: string]: string 
}

这个就类似于map

元组

元组类型是另一种类型的数组,它确切地知道包含多少个元素,以及特定索引对应的类型。例如坐标

var point: [number,number] = [189,210]
console.log(point)

类型推论

在 TS 中,某些没有明确指出类型的地方,TS 的 类型推论机制会帮助提供类型 。

image-20240827161045343

image-20240827161159722

字面量类型

image-20240827162123712

我们可以利用这一特性,搭配联合类型一起使用来限制方法的值

function move(to: 'top'|'bottom'|'right'|'left'){
    console.log(to)
}

move('top')

高级类型

Class类

class Person{
    // 属性
    name: string
    age = 18
    high: number = 170
    // 构造函数
    constructor(name: string,age: number,high: number){
        this.name = name
        this.age = age
        this.high = high
    }
}

var p = new Person('tom',18,180)

console.log(p)

继承

class Animal{
    color: string
    constructor(color: string){
        this.color = color
    }
}

class Dog extends Animal{
    name: string

    constructor(color: string,name: string){
        super(color)
        this.name = name;
    }
}

var d = new Dog('red','wangcai')

console.log(d)

实现接口

interface Animal{
    run(): void
}

class Dog implements Animal{
    run(): void{
        console.log("run run run")
    }
}

var d = new Dog()
d.run()

类成员可见性