在Typescript中导出接口的目的是什么?
新的打字脚本。我可以看出,您可以定义一个接口,并在整个Typescript项目中使用它。我可以看到许多博客、教程和文档,描述如何“导出”接口。然而,我不明白你为什么要这么做。我当然能理解导出类、常量或变量。。。。但导出接口会带来什么好处呢?如果必要的话,你似乎可以随时参考它 显然,我遗漏了一个关键概念,我们非常感谢您提供的任何清晰或见解。编译安全性 您可以导出一个接口,以便将其导入到另一个类中,该类将实现它。通过这种方式,您可以获得接口契约的类型安全性在Typescript中导出接口的目的是什么?,typescript,amd,Typescript,Amd,新的打字脚本。我可以看出,您可以定义一个接口,并在整个Typescript项目中使用它。我可以看到许多博客、教程和文档,描述如何“导出”接口。然而,我不明白你为什么要这么做。我当然能理解导出类、常量或变量。。。。但导出接口会带来什么好处呢?如果必要的话,你似乎可以随时参考它 显然,我遗漏了一个关键概念,我们非常感谢您提供的任何清晰或见解。编译安全性 您可以导出一个接口,以便将其导入到另一个类中,该类将实现它。通过这种方式,您可以获得接口契约的类型安全性 import { IPerson } fr
import { IPerson } from "./person.i";
export class Person implements IPerson {
// ...
}
假设您有一个接口IPerson
(很抱歉这句陈词滥调!)
现在,您可以具体实现此接口,称为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 {
// ...
}
依赖抽象 通过导出接口,可以将其导入其他地方并依赖于它,而不是依赖于具体实现的程序。(这是 如果您有一个函数
getPersonFullName
接收人员
:
getPersonFullName(person: Person) {
return person.getFirstName() + " " + person.getLastName();
}
这将不能用于IPerson
的其他实现,即使它们满足相同的合同和要求(例如,如果您制作了一个ificationalPerson
)
通过导入IPerson
并依赖它,您可以确保您的功能将与IPerson
的任何实现一起工作,而不是与特定的Person
实现一起工作
import { IPerson } from "./person.i";
getPersonFullName(person: IPerson) {
return person.getFirstName() + " " + person.getLastName();
}
您可能希望导出它,以便可以使用它对某种数据格式进行建模,以便在编译期间在IDE中自动完成并进行类型检查 我自己在不需要完整类的情况下也这样做过,所以我使用一个接口来描述数据对象的外观,以便在开发过程中减少猜测。接口没有编译成Javascript,因此会丢失。它们仅在编译时或IDE中对开发有用 如果必要的话,你似乎可以随时参考它 全球接口无处不在。要创建全局接口,只需将代码放入一个TypeScript文件中,而不使用顶级的
import
和export
关键字
但是,与老式的全局变量一样,全局接口也会遇到命名冲突。导出的接口解决了这个问题
例如:
// 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
谢谢@James。。。。我理解你的例子。但是,如果我有一个包含接口的文件,并且我选择明确地“实现”接口(这对我来说似乎是最佳编程实践),那么只要它位于一个没有导出的文件中,我就不需要导入它,比如我可能为我的项目构建的.d.ts文件。我完全明白为什么接口如此强大,我只是不明白导出它们的目的是什么。。。。因为它们可以通过引用使用,而无需导出/导入。谢谢@Paleo。这正好回答了我的问题,我现在完全明白你为什么要这么做。