zoukankan      html  css  js  c++  java
  • 在typescript中interface和type的区别和相同点

     

    相同点

    1.都可以描述一个对象或者函数

    interface
    
    interface People {
        name: string
        age: number
    }
    interface setPeople {
        (name:string,age:number):void
    }
    type
    
    type People = {
        name: string
        age: number
    };
    type setPeople = (name:string,age:12)=>void;

    2.都允许相互拓展属性,但是语法不同

    interface extends interface 关键词:extends
    
    interface Name {
        name:string;
    }
    interface People extends Name {
        age:number;
    }

    interface extends type 关键词:extends

    type Name = {
        name:string;
    }
    type People = Name & {age:number}

    type extends type 关键词:&

    type Name = {
        name:string;
    }
    type People = Name & {age:number}

    type extends interface 关键词:&

    interface Name = {
        name:string;
    }
    type People = Name & {age:number}
    • 总结只要是interface扩展属性无论是interface还是type都使用关键字extends;type的扩展属性无论是type还是interface都是使用关键字&

    不同点

    interface支持的声明格式,type不支持

    ·interface可以多次定义相同的名称,并且会自动合并所声明的所有成员,type不支持

     interface Person {
         name:String
     }
     interface Person {
         age: Number
     }
     const person: Person = {name:'zs',age:12}

    type支持的声明格式,interface不支持

    · 类型别名可以用于其它类型 (联合类型、元组类型、基本类型(原始值)),interface不支持

    type PersonName = {name:string}
    type PersonAge = {age:number}
    ​
    // union(联合)
    type person = PersonName|PersonAge;
    ​
    //tuple(元祖)
    type Data = [PersonName,PersonAge]
    ​
    //primitive(原始值)
    type age = number;
    ​
    // tyoeof的返回值
    let age = 12
    type name = typeof age;

    ·type支持能使用in关键字生成映射类型,interface不支持

    type Keys = 'firstname' | 'surname';
    ​
    type DudeType = {
        [key in Keys] :string; //映射每个参数
    };
    ​
    const test: DudeType = {
        firstname: 'zhang',
        surname: 'san'
    }

    既然提到了映射类型,来了解一下映射类型在ts中的妙用:

    TypeScript提供了从旧类型中创建新类型的一种方式 — 映射类型。 在映射类型里,新类型以相同的形式去 转换旧类型里每个属性。

    interface People {
        name: string
        age: number
        height:number
        address:string
    }
    ​
    //自定义映射规则
    type Nullable<T> = {[P in keyof T]: T[P] | null}//调用此映射后可以设置属性值为null
    ​
     
    const person: Nullable<People> = {name:'zs',age:12, height:null,address:null}
    ​
    const person1: Readonly<People> = {name:'zs',age:12, height:12,address:'utuy'}
    ​
    const person2: Partial<People> = {name:'zs', height:12,address:'utuy'}
    //Readonly是ts内部自带只读的映射,实现原理如下
    // type Readonly<T> = {
    //     readonly [P in keyof T]: T[P];
    // }
    //
    //Partial是ts内部自带的可选的映射,实现原理如下
    // type Partial<T> = {
    //     [P in keyof T]?: T[P];
    // }
    //
    // person1.name='dsad'//这时候不能更改此属性

     

    默认导出方式不同

    // inerface 支持同时声明,默认导出 而type必须先声明后导出
    export default interface Config {
      name: string;
    }
    // 同一个js模块只能存在一个默认导出哦
     type Config2 = {name: string}
      export default Config2

    总结: 一般来说,如果不清楚什么时候用interface/type,能用 interface 实现,就用 interface , 如果不能就用 type 。其他更多详情参看 官方规范文档

     

    不停学习,热爱是源源不断的动力。
  • 相关阅读:
    PHP 类中的魔术方法
    C# Redis Server分布式缓存编程 网络转载
    CSS的position属性:relative和absolute
    会话控制——Cookie和Session
    HTTP协议
    常见浏览器兼容性问题与解决方案
    for循环0,1,1,2,2可以组成多少个不重复的五位数?
    单例模式
    第二周作业影评、靶机和攻击机的安装与配置、kali的配置、DNS解析
    20169206 201620172 《网络攻防实践》第六周学习总结
  • 原文地址:https://www.cnblogs.com/ximenchuifa/p/14896970.html
Copyright © 2011-2022 走看看