'界面'之间的区别和'声明界面'

时间:2016-07-31 10:44:54

标签: typescript

之间有什么区别(如果有的话)
declare interface SomeInterface {
    //members here
}

interface SomeInterface {
    //members here
}

2 个答案:

答案 0 :(得分:14)

declare关键字通常用于类型定义,以描述在JavaScript代码中外部定义的现有类或变量。

declare interfaceinterface之间没有区别,因为:

  • 接口没有代码生成,它们只存在于 打字稿代码,因此您无法declare interface定义 JavaScript代码;
  • Typescript中的接口本质上是声明 只是,它没有方法体,属性值等等 declare interfaceinterface在语法上是相同的。

答案 1 :(得分:0)

接口声明合并的概念对于理解该问题也将有所帮助。在TS接口声明中,合并的工作方式如下:

每当我们多次声明一个接口(带有或不带有declare关键字)时,它们都会合并在一起。这意味着该接口现在具有两个接口的属性合并在一起。最好通过一个例子来理解:

// Usually this interface would be defined in another file
// or package already
interface foo { num1: number }

// Because the interface foo is already defined TS will apply 
// interface declaration merging
declare interface foo{num2: number}
// Declare keyword makes it more explicit that is was defined
// somewhere else, it adds n


let fooObj: foo = { num1: 1 }
// Typescript will give the following error:
// Property 'num2' is missing in type '{ num1: number; }' 
// but required in type 'foo'.(2741)

// It requires the property num2 because after the interface merging 
// the interface contains both num1: number, and num2: number properties


// This interface declaration merging functionally similar to 
// the foo interface above, just without the declare keyword
interface bar{ string1: string }
interface bar{ string2: string }

let barObj: bar = { string1: 'hi', string2: 'hithere' }

declare关键字位于界面之前

请注意, declare interface可以使接口在其他地方定义更加明确(其他文件,包等)。即,它根本不增加任何额外功能。

还请注意,接口只是用于向TS编译器提供其他类型信息,而在已编译的JS中不存在。上面的代码被编译为以下JS:

"use strict";
let fooObj = { num1: 1 };
let barObj = { string1: 'hi', string2: 'hithere' };