请问一下,定义了Class,引入Class 和 引入type Class 的区别是什么?

请问一下,TypeScript面向对象编程。定义了Class,引入Class 和 引入type Class 的区别是什么?

Person.ts

export class Person {
  name: string
  age: number 
  height: number 
}

在测试代码中:test.ts

import { type Person} from './person.ts'

const p:Person = {
  name: '',
  age: 0,
  height: 0
}

console.log(p) 

不管引入:{ type Person } 还是引入{ Person },感觉都没有差异。
请问:
1、引入Class 和 引入type Class 的区别是什么?
2、在哪些场景下应该引用type Class

阅读 693
avatarAI BotBETA

1、引入Class 和 引入type Class 的区别是什么?

在TypeScript中,当你从另一个模块引入内容时,import { Person }import { type Person } 之间的主要区别在于它们如何被TypeScript编译器处理以及它们的用途。

  • import { Person }:这种导入方式用于引入实际的类定义,这意味着你可以创建Person类的实例,使用其构造函数、方法、属性等。这是最常见的导入方式,用于在代码中直接使用类的所有功能。
  • import { type Person }:自TypeScript 3.8起,TypeScript引入了类型导入(Type Imports)的概念。使用type关键字时,你仅导入该类型的类型信息,而不包括其实例化或任何其他运行时功能。这主要用于类型注解、类型守卫、泛型约束等,并且可以帮助减少编译后的代码体积,因为TypeScript编译器会移除所有仅用于类型检查的代码。然而,对于类(如Person),由于类的声明本身既是类型又是值,使用type关键字实际上并不会有太大的差异,因为TypeScript会推断出你需要的上下文(类型或值)。但是,对于接口(Interface)或类型别名(Type Alias),使用type导入会明确表明你只关心类型信息。

2、在哪些场景下应该引用type Class

对于类(Class)而言,直接使用import { Person }通常是更直接且常见的方式,因为它允许你创建类的实例并使用其所有功能。然而,在以下场景中,考虑使用import { type Person }可能会更清晰或有助于优化:

  • 当你只需要类型信息时:如果你只是需要一个类型用于类型注解、类型守卫或泛型约束,并且不需要创建类的实例,那么使用type导入可以使你的意图更加明确。
  • 优化打包体积:在某些情况下,如果你的项目中包含大量的类型定义,而这些定义在运行时并不需要,使用type导入可以帮助TypeScript编译器更精确地移除这些类型信息,从而可能减少打包后的体积。然而,对于类来说,这个效果可能不太明显,因为类的声明本身就是类型和值的结合。
  • 代码清晰度:在大型项目中,使用type导入可以清晰地表明某些导入仅用于类型目的,这有助于其他开发者理解代码的结构和意图。

对于你给出的Person.tstest.ts示例,由于Person是一个类,所以使用import { Person }import { type Person }在功能上没有区别。但是,如果你只是想在test.ts中使用Person类型作为类型注解,而不打算创建Person的实例,那么使用import { type Person }可能会稍微提高代码的清晰度。然而,这并不是一个强制性的规则,更多的是一种编码风格和最佳实践的选择。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题