Skip to main content

type 和 interface 的区别是什么?

官方给出的文档说明

  • 组合方式:interface 使用 extends 来实现继承,type 使用 & 来实现联合类型。

    interface

    interface Animal {
    name: string
    }

    interface Bear extends Animal {
    honey: boolean
    }

    const bear = getBear()
    bear.name
    bear.honey

    type

    type Animal = {
    name: string
    }

    type Bear = Animal & {
    honey: boolean
    }

    const bear = getBear();
    bear.name;
    bear.honey;
  • 扩展方式:interface 可以重复声明用来扩展,type 一个类型只能声明一次

    interface

    interface Window {
    title: string
    }

    interface Window {
    ts: TypeScriptAPI
    }

    const src = 'const a = "Hello World"';
    window.ts.transpileModule(src, {});

    type

    type Window = {
    title: string
    }

    type Window = {
    ts: TypeScriptAPI
    }

    // Error: Duplicate identifier 'Window'.
  • 范围不同:type 适用于基本类型,interface 一般不行。

  • 命名方式:interface 会创建新的类型名,type 只是创建类型别名,并没有新创建类型。

其他……建议搜一下博客。

相同点

  • 两者都可以用来描述对象或函数的类型,但是语法不同。

    • interface:接口是一系列抽象方法的声明,第三方就可以通过这组抽象方法调用,让具体的类执行具体的方法
    interface IPerson {
    firstName: string
    lastName: string
    sayHi: () => string
    }

    var customer: IPerson = {
    firstName: 'Tom',
    lastName: 'Hanks',
    sayHi: string => {
    return 'Hi there'
    }
    }

    console.log('Customer 对象 ')
    console.log(customer.firstName)
    console.log(customer.lastName)
    console.log(customer.sayHi())
    • type:联合类型可以通过|将变量设置多种类型,赋值时可以根据设置的类型来赋值。
    var val: string | number
    val = 12
    console.log('数字为 ' + val)
    val = 'Runoob'
    console.log('字符串为 ' + val)
  • 都允许继承(extends)

    • interface extends interface
    interface Name {
    name: string
    }
    interface User extends Name {
    age: number
    }
    • typetype 相交
    type Name = {
    name: string
    }
    type User = Name & { age: number }
    • interface extends type
    type Name = {
    name: string
    }
    interface User extends Name {
    age: number
    }
    • typeinterface 相交
    interface Name {
    name: string
    }
    type User = Name & {
    age: number
    }

不同点

  • type 可以而 interface 不行 type 可以声明基本类型别名,联合类型,元组等类型
  • interface 可以而 type 不行 interface 能够声明合并

参考文章