• ts的接口和对象类型


    ts的接口和对象类型

    TypeScript中定义对象的方式要用关键字interface。但是在众多的中文资料里关于interface的理解都是一种对于数据的约束,让数据的结构满足约束(interface)的格式。

    1.与接口一致

    //这样写是会报错的 因为我们在person定义了a,b但是对象里面缺少b属性
    //使用接口约束的时候不能多一个属性也不能少一个属性
    //必须与接口保持一致
    interface Person {
        a:string,
        b:string
    }
     // WRONG
    const person:Person  = {
        a:"213"
    }
    // OK
    const person:Person  = {
        a:"我"
        b:"你"
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    在这里特别强调了不能多一个属性也不能少一个属性,可能是因为在JavaScript中给1个Object增加属性是一个非常自然的事情。比如下面这样:

    let obj = {
        name: "Adam"
    }
    
    let obj.age = 20
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2.可选属性

    可选属性顾名思义就是就是该属性可以不存在。

    在想要标记为可选属性的属性名后+1个?就🆗了。

    那么在进行一些数据结构构造的时候,即使该属性没有定义也符合interface的约束。

    //可选属性的含义是该属性可以不存在
    //所以说这样写也是没问题的
    interface Person {
        a:string,
        b?:string //可选属性
    }
     // OK
    const person:Person  = {
        a:"213"
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    3.任意属性

    任意属性需要通过索引签名(indexSignatures)来实现。

    当你声明一个索引签名时,所有明确的成员都必须符合索引签名。

    //在这个例子当中我们看到接口中并没有定义C但是并没有报错
    //应为我们定义了[propName: string]: any;
    //允许添加新的任意属性
    interface Person {
        a:string,
        b?:string,
        [propName: string]: any; //索引签名
    }
     
    const person:Person  = {
        a:"213",
        c:"123"
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    [propName: string]: any经常使用在前端接受后端返回数据时的场合。当我们只能确定肯定需要a属性而不确定是否需要其他属性时可以在这样。

    3.1索引签名

    经过了解后才发现索引签名是一个非常复杂的东西,具体的可以看下面这篇blog👇

    索引签名 | 深入理解 TypeScript

    举一个小小的例子,剩下的就看blog吧👆

    // OK
    let a: { [propName: string]: any } = {
        c: '123',
        d: '123',
        e: '123'
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    4.readonly

    readonly修饰的属性只能读不能修改

    interface Person {
        readonly a: string, //只读
        b?: string,
    }
    
    let person: Person = {
        a: '123',
    }
    //Cannot assign to 'a' because it is a read-only property.
    person.a='a' 
    // OK
    person.b='b'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    5.添加函数

    interface中也可以声明一个属性类型为function

    interface Person {
     f: (num1: number, num2: number) => number
    }
    
    let person: Person = {
     f: (n1, n2): number => { return num1 + num2; }
    }
    
    let num1 = 1;
    let num2 = 2;
    console.log(person.f(num1, num2)); // output
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
  • 相关阅读:
    学习 Python 之 Pandas库
    C++基础——对于C语言缺点的补充(1)
    到底什么才是真正的商业智能(BI)
    数据结构-01 数据结构基本概念,算法时间复杂度,空间复杂度
    云计算发展的十年IaaS、Paas、SaaS、APaaS
    01 - Linux系统概要(再论计算机系统)
    听大佬讲:学习 AXI从哪里开始?
    洛谷P4799 [CEOI2015 Day2] 世界冰球锦标赛
    JavaSE项目练习:图书管理系统
    LoRa和LoRaWAN详细介绍
  • 原文地址:https://blog.csdn.net/qq_40710190/article/details/133381268