Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Typescript中导出接口的目的是什么?_Typescript_Amd - Fatal编程技术网

在Typescript中导出接口的目的是什么?

在Typescript中导出接口的目的是什么?,typescript,amd,Typescript,Amd,新的打字脚本。我可以看出,您可以定义一个接口,并在整个Typescript项目中使用它。我可以看到许多博客、教程和文档,描述如何“导出”接口。然而,我不明白你为什么要这么做。我当然能理解导出类、常量或变量。。。。但导出接口会带来什么好处呢?如果必要的话,你似乎可以随时参考它 显然,我遗漏了一个关键概念,我们非常感谢您提供的任何清晰或见解。编译安全性 您可以导出一个接口,以便将其导入到另一个类中,该类将实现它。通过这种方式,您可以获得接口契约的类型安全性 import { IPerson } fr

新的打字脚本。我可以看出,您可以定义一个接口,并在整个Typescript项目中使用它。我可以看到许多博客、教程和文档,描述如何“导出”接口。然而,我不明白你为什么要这么做。我当然能理解导出类、常量或变量。。。。但导出接口会带来什么好处呢?如果必要的话,你似乎可以随时参考它

显然,我遗漏了一个关键概念,我们非常感谢您提供的任何清晰或见解。

编译安全性 您可以导出一个接口,以便将其导入到另一个类中,该类将实现它。通过这种方式,您可以获得接口契约的类型安全性

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。这正好回答了我的问题,我现在完全明白你为什么要这么做。