Skip to content

ts的常见使用

ts官网可以打开演练场用来练习ts语法

类型推断

js
// 类型注解
let str: string = 'abc'
// 或者不给值先进行预声明
let str: string
str = 'abc'
// 类型注解
let str: string = 'abc'
// 或者不给值先进行预声明
let str: string
str = 'abc'

类型断言

js
let numArr = [1, 2, 3, 4, 5]
// 这句话操作的最终结果我们断言是number类型
const result = numArr.find(item=> item > 2) as number
result * 5
let numArr = [1, 2, 3, 4, 5]
// 这句话操作的最终结果我们断言是number类型
const result = numArr.find(item=> item > 2) as number
result * 5

基本类型综合示例以及联合类型

js
let v1: string = 'abc'
let v2: number = 10
let v3: boolean = true
let nu: null = null
let un: undefined = undefined

// 联合类型
let v4: string | null = null
// 具体值的限定
let v5: 1 | 2 | 3 | 4 | 5 = 3
let v1: string = 'abc'
let v2: number = 10
let v3: boolean = true
let nu: null = null
let un: undefined = undefined

// 联合类型
let v4: string | null = null
// 具体值的限定
let v5: 1 | 2 | 3 | 4 | 5 = 3

数组、元祖、枚举

js
// 由数值组成的数组
let arr: number[] = [1, 2, 3]  
let arr1: Array<number> = [1, 2, 3]

// 元祖
let t1: [number, string, number] = [1, 'a', 3]
let t2: [number, string, number?] = [1, 'a']  // ?表示可选

// 枚举
enum MyEnum {
    A,
    B,
    C
}
console.log(myEnum.A, myEnum.B, myEnum.C)
console.log(myEnum[0])

// void - 空 - 只能被分配undefined值
// 一般用在没有返回值的函数里面
let myFn = (a: number, b: string): string=> {
    return a + b
}
// 如果没有返回值用void
let myFn = (a: number, b: string): void=> {
    console.log(a + b)
}

 // 可选参数加?(所有可选参数在尾部)
 let myFn = (a = 10, b: string, c?: boolean, ...rest: number[]): number=> {
    return 100
}

const f = myFn(20, 'abc', true, 1, 2, 3)
// 由数值组成的数组
let arr: number[] = [1, 2, 3]  
let arr1: Array<number> = [1, 2, 3]

// 元祖
let t1: [number, string, number] = [1, 'a', 3]
let t2: [number, string, number?] = [1, 'a']  // ?表示可选

// 枚举
enum MyEnum {
    A,
    B,
    C
}
console.log(myEnum.A, myEnum.B, myEnum.C)
console.log(myEnum[0])

// void - 空 - 只能被分配undefined值
// 一般用在没有返回值的函数里面
let myFn = (a: number, b: string): string=> {
    return a + b
}
// 如果没有返回值用void
let myFn = (a: number, b: string): void=> {
    console.log(a + b)
}

 // 可选参数加?(所有可选参数在尾部)
 let myFn = (a = 10, b: string, c?: boolean, ...rest: number[]): number=> {
    return 100
}

const f = myFn(20, 'abc', true, 1, 2, 3)

接口

通常用作对象的定义

  • 我们希望一个对象都包含name和age
js
// 规定obj对象的格式
interface ObjInterface {
    name: string,
    age: number
}

const obj: ObjInterface = {
    name: 'foo',
    age: 1
}
// 规定obj对象的格式
interface ObjInterface {
    name: string,
    age: number
}

const obj: ObjInterface = {
    name: 'foo',
    age: 1
}

别名

js
// 有多个数据可能有不同数据类型,可以自己定义规则
type MyUserName = string | number
let a: MyUserName = 'abc'
let b: MyUserName = 123
// 有多个数据可能有不同数据类型,可以自己定义规则
type MyUserName = string | number
let a: MyUserName = 'abc'
let b: MyUserName = 123

泛型

js
// 泛型 - 表示可能是任意数据类型
// 一个通用函数
const myFn<T> = (a: T, b: T): T[]=> {
    return [a, b]
}

// 在使用的时候规定数据类型
myFn<number>(1, 2)
myFn<string>('1', '2')
myFn(1, 2)  // 这样也可以,ts有类型推断的功能
// 泛型 - 表示可能是任意数据类型
// 一个通用函数
const myFn<T> = (a: T, b: T): T[]=> {
    return [a, b]
}

// 在使用的时候规定数据类型
myFn<number>(1, 2)
myFn<string>('1', '2')
myFn(1, 2)  // 这样也可以,ts有类型推断的功能

函数重载

js
let myFn = myFn = (value: string | number): string =>{
    if(typeof value === 'string') {
        return 'name' + value
    }

    if(typeof value === 'number') {
        return 'value' + value
    }

    return 
}

myFn(1)
myFn('a')
let myFn = myFn = (value: string | number): string =>{
    if(typeof value === 'string') {
        return 'name' + value
    }

    if(typeof value === 'number') {
        return 'value' + value
    }

    return 
}

myFn(1)
myFn('a')

继承

js
interface Parent {
    prop1: string
    prop2: number
}

interface Child extends Parent {
    prop3: string
}

const myObj: Child = {
    prop1: ''
    prop2: 1
    prop1: ''
}
interface Parent {
    prop1: string
    prop2: number
}

interface Child extends Parent {
    prop3: string
}

const myObj: Child = {
    prop1: ''
    prop2: 1
    prop1: ''
}

ts对类设置了很多功能

类的修饰符

  • 可选属性
  • 属性默认值
  • 私有属性
  • 受保护属性
  • 静态成员
js
class Article {
    // 成员属性
    // 规定类的实例需要哪些属性
    public title: string  // 公开的可以在任意位置访问的属性,即可以在类自身内部以及类的实例(类的外部)以及继承的字类中都可以访问的属性
    content: string  // 可加可不加,不加默认是public
    aaa?: string  // 可选熟悉
    bbb = 100

    private tempData: string // 私有属性,只能在当前类的内部使用
    protected innerData: string // 受保护的属性(只能在当前类内部,或者子类中进行访问),即不能在实例中使用

    static author: string  // 静态属性,将属性设置给类本身,而不是设置给类的实例

    // 如果希望是静态的,又希望只能通过类内部访问
    // static必须在后面
    // readonly表示只读
    private static readonly author1: string = 'aaaasss' // 私有静态属性

    // 构造器 - 如果不在上面写,也可以直接写在参数里面
    // constructor(public title: string) {
    constructor(title: string, content: string) {
        this.title = title;
        this.content = content;

        Article.author1  // 只能在这里使用,且不能修改
    }
}

const a = new Article('标题', '内容')
a.tempData  // 无法访问
Article.author  // a.author无法访问

// 继承类
class B extends Article {
    constructor(title: string, content: string) {
        super(title, content)  // 继承

        this.innerData
    }
}
class Article {
    // 成员属性
    // 规定类的实例需要哪些属性
    public title: string  // 公开的可以在任意位置访问的属性,即可以在类自身内部以及类的实例(类的外部)以及继承的字类中都可以访问的属性
    content: string  // 可加可不加,不加默认是public
    aaa?: string  // 可选熟悉
    bbb = 100

    private tempData: string // 私有属性,只能在当前类的内部使用
    protected innerData: string // 受保护的属性(只能在当前类内部,或者子类中进行访问),即不能在实例中使用

    static author: string  // 静态属性,将属性设置给类本身,而不是设置给类的实例

    // 如果希望是静态的,又希望只能通过类内部访问
    // static必须在后面
    // readonly表示只读
    private static readonly author1: string = 'aaaasss' // 私有静态属性

    // 构造器 - 如果不在上面写,也可以直接写在参数里面
    // constructor(public title: string) {
    constructor(title: string, content: string) {
        this.title = title;
        this.content = content;

        Article.author1  // 只能在这里使用,且不能修改
    }
}

const a = new Article('标题', '内容')
a.tempData  // 无法访问
Article.author  // a.author无法访问

// 继承类
class B extends Article {
    constructor(title: string, content: string) {
        super(title, content)  // 继承

        this.innerData
    }
}

存取器

get\set方法

js
class User {
    private _password: string = ''

    // 看不到值
    get password(): string {
        return '********'
    }

    // 可以设置
    set password(newPass: string): void {
        this._password = newPass
    }
}

const u = new User();
console.log(u.password);
class User {
    private _password: string = ''

    // 看不到值
    get password(): string {
        return '********'
    }

    // 可以设置
    set password(newPass: string): void {
        this._password = newPass
    }
}

const u = new User();
console.log(u.password);

抽象类

  • 一些主要用来规范格式的,没有实例化需求
js
abstract class Animal {
    abstract name: string  // 抽象属性
    abstract makeSound(): void  // 抽象方法

    // 普通方法
    move(): void {
        console.log("move")
    }
}

// 继承抽象类
class Cat extends Animal {
    name: string = "Cat"
    makeSound(): void {

    }
}
abstract class Animal {
    abstract name: string  // 抽象属性
    abstract makeSound(): void  // 抽象方法

    // 普通方法
    move(): void {
        console.log("move")
    }
}

// 继承抽象类
class Cat extends Animal {
    name: string = "Cat"
    makeSound(): void {

    }
}

类实现接口

通过接口规范类

js
interface Animal{
    name: string  // 普通属性
    get sound(): string  // 存取器中的取
    makeSound(): void  // 普通方法
}

interface B {
    age: number
}

// 实现接口的类
class Dog implements Animal, B {
    name: string = 'Dog';
    age: number = 10
    get sound() {
        return ''
    }
    makeSound(): void {
        console.log('aaaa')
    }
}
interface Animal{
    name: string  // 普通属性
    get sound(): string  // 存取器中的取
    makeSound(): void  // 普通方法
}

interface B {
    age: number
}

// 实现接口的类
class Dog implements Animal, B {
    name: string = 'Dog';
    age: number = 10
    get sound() {
        return ''
    }
    makeSound(): void {
        console.log('aaaa')
    }
}

泛型类

js
class MyClass<T> {
    public value: T
    constructor(value: T) {
        this.value = value
    }

    do(input: T): void {
        console.log('1111', this.value)
    }
}

const myStr = new MyClass<string>('hello')
myStr.do('aaa')

const myNumber = new MyClass<number>(123)
myNumber.do(456)
class MyClass<T> {
    public value: T
    constructor(value: T) {
        this.value = value
    }

    do(input: T): void {
        console.log('1111', this.value)
    }
}

const myStr = new MyClass<string>('hello')
myStr.do('aaa')

const myNumber = new MyClass<number>(123)
myNumber.do(456)