打字稿新手。我可以看到你可以定义一个接口并在一个Typescript项目中使用它。我可以看到许多博客,教程和文档,描述了如何能够出口#34;一个界面。但是,我不明白为什么你会这样做。我当然可以理解导出类或常量或变量......但是导出界面会产生什么好处呢?如果有必要,您似乎总是可以通过引用使用它?
显然,我错过了一个关键概念,并且非常感谢所提供的任何清晰度或洞察力。
答案 0 :(得分:3)
如果有必要,您似乎可以随时使用它吗?
全球界面随处可见。要创建全局接口,只需将代码放在没有顶级import
和export
关键字的TypeScript文件中。
但是,与旧时尚全局变量一样,全局接口也存在命名冲突。导出的接口解决了这个问题。
示例:
// a.ts
export interface A {}
export default let a: A;
// b.ts
import b, {A as B} from './a'
// Here, the name of A is B
答案 1 :(得分:0)
您可以导出一个接口,以便将其导入到另一个实现它的类中。通过这种方式,您可以获得接口合同周围的类型安全性。
假设你有一个界面IPerson
(抱歉陈词滥调!)
export interface IPerson {
getFirstName(): string;
getLastName(): string;
getAgeInYears(): number;
}
现在,您将对此接口进行具体实现,称为Person
,但实际上没有引用该接口:
export class Person {
private _firstName: string;
private _lastName: string;
private _ageInYears: number;
constructor (firstName: string, lastName: string, ageInYears: number) {
this._firstName = firstName;
this._lastName = lastName;
this._ageInYears = ageInYears;
}
public getFirstName(): string {
return this._firstName;
}
public getLastName(): string {
return this._lastName;
}
public getAgeInYears(): number{
return this._ageInYears;
}
}
您的课程将正常运行,并具有IPerson
所需的所有行为,但如果您再向IPerson
界面添加其他方法(例如getFirstPetName(): string
),项目仍将继续建设(可能导致意外行为)。
这可以通过明确导入界面并使Person
实现它来解决,这样除非Person
符合合同,否则您的项目将无法构建。
import { IPerson } from "./person.i";
export class Person implements IPerson {
// ...
}
通过导出界面,可以将其导入其他地方并依赖,而不是依赖于具体实现的程序。 (这是dependency inversion principle)
如果您有getPersonFullName
函数Person
,则getPersonFullName(person: Person) {
return person.getFirstName() + " " + person.getLastName();
}
:
IPerson
即使它们符合相同的合同和要求(例如,如果您制作了IFictionalPerson
),也无法在IPerson
的其他实现中使用。
通过导入IPerson
并依赖它,您可以确保您的函数适用于Person
的任何实现,而不是特定的import { IPerson } from "./person.i";
getPersonFullName(person: IPerson) {
return person.getFirstName() + " " + person.getLastName();
}
实现。
{{1}}
答案 2 :(得分:0)
您可能希望将其导出,以便您可以使用它来建模某种数据格式,以便在IDE中自动完成并在编译期间键入检查。
在我不需要一个完整的类的情况下,我已经完成了这一点,因此我使用一个接口来描述数据对象应该如何看待所以我在开发过程中不那么猜测。接口不会编译成Javascript而丢失。它们仅在编译期间或IDE中用于开发时才有用。