TypeScript interface和type的区别

101 阅读1分钟

共同点

  • 都能描述函数、对象的类型信息

  • 允许彼此/互相继承

    • type & type

         type IPerson = {
             name: string;
         }
         type IStudent = IPerson & {
             age: number;
         }
         // type:不允许重复定义,所以不会进行合并
         let obj: IStudent = {
             name: 'lily',
             age: 19
         }
      
    • type & interface

          interface IPerson {
              name: string;
            }
          type IStudent = IPerson & {
              age: number;
           }
         // type:不允许重复定义,所以不会进行合并
         let obj: IStudent = {
             name: 'lily',
             age: 19
          }
      
    • interface & interface

          interface IPerson {
              name: string;
          }
          interface IStudent extends IPerson {
              age: number;
          }
          // type:不允许重复定义,所以不会进行合并
          let obj: IStudent = {
              name: 'lily',
              age: 19
          }
      
    • interface & interface

          interface IPerson {
          name: string;
          }
          interface IStudent extends IPerson {
              age: number;
          }
          // type:不允许重复定义,所以不会进行合并
          let obj: IStudent = {
              name: 'lily',
              age: 19
          }
      
  • type、interface 交集和并集

    type

    type IPerson = {
       name: string;
       age: number;
    
    }
    type IStudent = {
       age: number;
       count: number;
    }
    // 交集
    let obj: IStudent | IPerson = {
       name: 'lily',
       age: 19
    }
    // 并集
    let obj2: IStudent & IPerson = {
       name: 'lily',
       age: 19,
       count: 10
    
    }
    

    interface

    interface IPerson {
    name: string;
    age: number;
    }
    interface IStudent {
       age: number;
       count: number;
    }
    // 交集
    let obj: IStudent | IPerson = {
       name: 'lily',
       age: 19
    }
    // 并集
    let obj2: IStudent & IPerson = {
       name: 'lily',
       age: 19,
       count: 10
    
    }
    

不同点

  • interface重复定义会合并,type不会
        interface IPerson {
            name: string;
        }
        interface IPerson {
            age: number;
        }
        // IPerson被合并了
        let obj: IPerson = {
            name: 'lily',
            age: 19
        }
    
  • type不允许重复定义,直接报错,所以没有合并

image.png

  • type可以定义 类型别名字符串字面量类型interface不可以
    type TName = string; // 类型别名
    type IPerson = {
        name: TName;
    }
    
    let student: IPerson = {
        name: 'lily'
    };
    // 字符串字面量类型
    type TCode = '1' | '2' | '5'; 
    const str: TCode = '1';// 合法
    const str2: TCode = '9'; // 非法