泛型的作用?用法?
泛型:我们使用类型变量T,帮助我们提高代码的复用性和准确性;而使用了类型变量的函数叫做泛型,因为它适用于多个类型。
泛型类指的是实例部分的类型,类的静态属性不能使用这个泛型类型。
泛型约束:在T extends 接口,则传入函数的类型就要符合接口的(约束)类型的值。
注意:
在泛型里使用类类型,使用泛型创建工厂函数(比如装饰器工厂),需要引用构造函数
function create<T>(c: {new(): T; }): T { return new c(); }
模块和命名空间?
注意:官网中,“内部模块”被称作“命名空间”,“外部模块”被称为“模块”
模块:
模块在其自身的作用域里执行,而不是全局作用域,所以在模块内定义一个变量和函数在外部是不可见的,除非使用export导出,在其他模块使用import导入。
默认导出:
每个模块都可以有一个default导出。 默认导出使用 default关键字标记;并且一个模块只能够有一个default导出。 需要使用一种特殊的导入形式来导入 default导出。
类和函数声明可以直接被标记为默认导出。 标记为默认导出的类和函数的名字是可以省略的。
特殊情况:
为了支持CommonJS和AMD的exports, TypeScript提供了export =语法。
export =语法定义一个模块的导出对象。 这里的对象一词指的是类,接口,命名空间,函数或枚举。
若使用export =导出一个模块,则必须使用TypeScript的特定语法import module = require("module")来导入此模块
命名空间:
Namespace定义一个命名空间,命名空间也叫做内部模块,主要解决命名重复或者相似[使用命名空间是为了提供逻辑分组和避免命名冲突]。多文件中的命名空间,不同文件之间要存在一定的依赖关系,所以我们使用引用标签/// <reference path=””>来告诉编译器之间的关联.
别名:
使用import q = x.y.z给常用的对象起一个短的名字。 不要与用来加载模块的 import x = require('name')语法弄混了,这里的语法是为指定的符号创建一个别名。
命名空间和模块:
特性
命名空间(Namespace)
模块(Module)
作用域
全局作用域
独立作用域
依赖关系
不支持模块加载器
支持模块加载器(CommonJS、AMD、ES6等)
代码组织
内部代码组织
外部模块化开发
适用场景
小型项目或内部代码组织
大型项目和模块化开发
语法
namespace/export/import
export/import
运行效率
不生成模块加载代码,运行效率高
生成模块加载代码,支持动态加载
ES6兼容性
不兼容ES6模块规范
兼容ES6模块规范
补充:
在TypeScript中,declare关键字的核心作用是告诉TypeScript某个东西存在,但不需要关心它的实现。它只在编译阶段起作用,不会被编译成JavaScript代码。
装饰器的写法和作用?
装饰器是一种特殊类型的声明,它能够被附加到类声明,方法, 访问符,属性或参数上。
注:装饰器工厂则是我们学习NestTs很重要的一个知识点,学习装饰器工厂的同时我们将引入一个ts另一个很重要的点,Reflect(反射,将是我们学习IOC控制反转,DI依赖注入原理的关键)。
装饰器根据它的附加位置类装饰器,属性装饰器,方法装饰器,参数装饰器,访问符装饰器;
执行顺序:正常的属性装饰器和访问符装饰器,方法装饰器在类中按从上到下执行(优先执行实例成员,再执行静态成员);方法中的参数装饰器按从右到左执行,参数装饰优先执行于该方法的方法装饰器;类的成员拥有多个同类型装饰器,按从近到远执行;最后执行构造函数的参数装饰器,再执行类装饰器。
类装饰器 function fn(constructor[被装饰类的构造函数]:Function){},我们可以通过类装饰器重载构造函数;
方法装饰器
function fn(target: Object, propertyKey: string, descriptor: PropertyDescriptor){}
Target:如果被装饰方法是实例方法,target是类的原型;如果是静态方法,则是类的构造函数;propertyKey:是方法的名称(可能是字符串,也可能是符号symboi);descriptor:被装饰方法的属性描述符,其中它的value属性就是方法本身。
参数装饰器
function fn(target: Object, propertyKey: string, parameterIndex: number){}
Target和方法装饰器的一样;propertykey是被修饰方法的名称;parameterIndex则是参数列表中的索引。
访问器装饰器
function fn(target: any, propertyKey: string, descriptor: PropertyDescriptor) {}
target和方法装饰器一样;propertykey是访问器的名称;descriptor是访问器的属性描述符;
属性装饰器
function fn(target: any, propertyKey: string) {}
target和方法装饰器一样,properkey是属性名称
关键字Type的作用?
type 关键字用于声明 类型别名(Type Alias)。它允许你为一个类型创建一个新的名称,从而提高代码的可读性和复用性。type 关键字可以用于定义各种类型的别名,包括基本类型、联合类型、元组类型、对象类型等。