TypeScript小问题

2 分钟
44 阅读
TypeScript小问题

接口(interface)的声明顺序

ts 复制代码
import { AdminCustomerGroup } from "../../customer-group"
import { BaseCustomer, BaseCustomerAddress } from "../common"

export interface AdminCustomer extends BaseCustomer {
  /**
   * Whether the customer is a guest.
   */
  has_account: boolean
  /**
   * The groups the customer is in.
   */
  groups?: AdminCustomerGroup[]
  /**
   * The customer's addresses.
   */
  addresses: AdminCustomerAddress[]
}
export interface AdminCustomerAddress extends BaseCustomerAddress {}

在 TypeScript 中,接口(interface)的声明顺序并不影响它们的使用。这是因为 TypeScript 使用"声明提升"(Declaration Hoisting)的机制,类似于 JavaScript 中的变量和函数提升。

在这个文件中:

typescript 复制代码
export interface AdminCustomer extends BaseCustomer {
  addresses: AdminCustomerAddress[]  // 可以使用后面声明的接口
}

export interface AdminCustomerAddress extends BaseCustomerAddress {}

即使 AdminCustomerAddressAdminCustomer 之后声明,它仍然可以在 AdminCustomer 中使用,因为:

  1. TypeScript 会在编译时将所有类型声明提升到作用域的顶部
  2. 在同一个文件中的接口声明是互相可见的
  3. 接口声明的顺序不会影响它们之间的引用关系

这与 JavaScript 中的类(class)不同,类必须先声明后使用。这是 TypeScript 类型系统的一个特性,使得我们可以更灵活地组织代码结构。

评论

评论

发表评论