2023 typescript 面试题

62 阅读6分钟

juejin.cn/post/716201…

TypeScript和JavaScript的区别是什么?

超集 Typescript 是纯面向对象的编程语言,包含类和接口的概念

Declare(断言)

所有的JavaScript库/框架都没有TypeScript声明文件,但是我们希望在TypeScript文件中使用它们时不会出现编译错误。

在我们希望定义可能存在于其他地方的变量的环境声明和方法中,可以使用declare关键字。

枚举(enum)

Ts 的数据类型。它允许我们定义一组命名常量。可以是数字值或字符串值

装饰器

就是一个方法,可以注入到类,方法,属性,参数上来扩展类,方法,属性,参数的功能。

装饰器的分类: 类装饰器、方法装饰器、属性装饰器、参数装饰器

模块

模块是相关类、函数、变量和接口的集合。在项目之间共享代码。

内置的数据类型有哪些

// 数字类型:用于表示数字类型的值。TypeScript 中的所有数字都存储为浮点值。
let num: number = 1;
​
// 字符类型: 用于表示字符串类型的值
let str: string = "CoderBin";
​
// 布尔类型:一个逻辑二进制开关,包含true或false
let flag: boolean = true// void 类型:分配给没有返回值的方法的类型。
let unusable: void = undefined;
​

ts 主要特点

  • 跨平台:TypeScript 编译器可以安装在任何操作系统上,包括 Windows、macOS 和 Linux。
  • ES6 特性:TypeScript 包含计划中的 ECMAScript 2015 (ES6) 的大部分特性,例如箭头函数。
  • 面向对象的语言:TypeScript 提供所有标准的 OOP 功能,如类、接口和模块。
  • 静态类型检查:TypeScript 使用静态类型并帮助在编译时进行类型检查。因此,你可以在编写代码时发现编译时错误,而无需运行脚本。
  • 可选的静态类型:如果你习惯了 JavaScript 的动态类型,TypeScript 还允许可选的静态类型。

never void 区别

void 表示没有任何类型(可以被赋值为 null 和 undefined)。

never 表示一个不包含值的类型,即表示永远不存在的值。

拥有 void 返回值类型的函数能正常运行。拥有 never 返回值类型的函数无法正常返回,无法终止,或会抛出异常。

断言(as)

允许变量从一种类型更改为另一种类型。

any unknown 区别

any 和 unknown 都是顶级类型,但是 unknown 更加严格,不允许访问属性,不允许赋值给其他有明确类型的变量。(不明确类型:unknown,any等)

原因:对 unknown 类型的值执行大多数操作之前,我们必须进行某种形式的检查。而在对 any 类型的值执行操作之前,我们不必进行任何检查。

tsconfig.json 作用

可以指定不同的选项来告诉编译器如何编译当前项目。

// 常用配置
{
  /*
      tsconfig.json是ts编译器的配置文件,ts可以根据它的信息来对待吗进行编译 可以再tsconfig中写注释
      include : 用来指定哪些文件需要被编译
      exclude : 用来指定哪些文件不需要被编译 :默认node_module
      extends : 用来指定继承的配置文件
      files   : 用来指定被编译的文件列表,只有编译少量文件才使用
      compilerOptions : 编译器的选项是配置文件中非常重要也是非常复杂的配置选项
  */

如何实现继承

extend关键字来实现

内置(原始)数据类型有哪些

boolean(布尔类型)

number(数字类型)

string(字符串类型)

void 类型

null 和 undefined 类型

array(数组类型)

tuple(元组类型):允许表示一个已知元素数量和类型的数组,各元素的类型不必相同

enum(枚举类型):enum类型是对JavaScript标准数据类型的一个补充,使用枚举类型可以为一组数值赋予友好的名字

any(任意类型)

never 类型

object 对象类型。

const readonly 区别

const可以防止变量的值被修改,在运行时检查,使用const变量保存的数组,可以使用push,pop等方法

readonly可以防止变量的属性被修改,在编译时检查,使用Readonly Array声明的数组不能使用push,pop等方法

any 的问题

类型污染:any 类型的对象会导致后续的属性类型都变成any

使用不存在的属性或方法不报错

解释一下枚举

枚举就是一个对象的所有可能取值的集合

enum Day {SUNDAY, MONDAY,TUESDAY, WEDNESDAY,THURSDAY,FRIDAY,SATURDAY}

中如何联合枚举类型的 Key?————用下标

  enum Status {xiaoming, xiaohong, xiaogang,}
•
  console.log(Status.xiaoming,Status[0]);
  console.log(Status.xiaohong,Status[1]);
  console.log(Status.xiaogang,Status[2]);
  
  //输出: 0 xiaoming
  //      1 xiaohong
  //      2 xiaogang

keyof 和 typeof 关键字的作用?

①keyof 索引类型查询操作符, 获取一个类型的所有属性名组成的联合类型

keyof

typeof是一个类型查询操作符,它用于获取一个值的类型。

any、never、unknown、null & undefined 和 void 有什么区别?

any: 动态的变量类型(失去了类型检查的作用)。

never: 永不存在的值的类型。例如:never 类型是那些总是会抛出异常或根本就不会有返回值的函数表达式或箭头函数表达式的返回值类型。

unknown: 任何类型的值都可以赋给 unknown 类型,但是 unknown 类型的值只能赋给 unknown 本身和 any 类型。

null & undefined: 默认情况下 null 和 undefined 是所有类型的子类型。 就是说你可以把 null 和 undefined 赋值给 number 类型的变量。当你指定了 --strictNullChecks 标记,null 和 undefined 只能赋值给 void 和它们各自。

void: 没有任何类型。例如:一个函数如果没有返回值,那么返回值可以定义为void。

泛型

在编写代码时使用一些以后才指定的类型,

any 和 泛型 的区别

泛型有类型推论,编译器会根据传入的参数自动确定类型

any 则是不检测

接口 与 type

TypeScript 中同名的 interface 或者同名的 interface 和 class 可以合并吗?

同名的interface会自动合并,同名的interface和class会自动聚合。

type 和 interface 的区别?

相同:

  1. 都可以描述 '对象' 或者 '函数'
  2. 都允许拓展(extends):interface 和 type 都可以拓展,并且两者并不是相互独立的,也就是说 interface 可以 extends type, type 也可以 extends interface 。 虽然效果差不多,但是两者语法不同。

不同:

  1. type 可以声明基本类型,联合类型,元组
  2. type 可以使用 typeof 获取实例的类型进行赋值
  3. 多个相同的 interface 声明可以自动合并
interface 可以给 Function / Array / Class(Indexable)做声明吗?

可以

可以使用 String、Number、Boolean、Symbol、Object 等给类型做声明吗?

可以

TS中什么是方法重载?

方法重载是指在一个类中定义多个同名的方法,但要求每个方法具有不同的参数的类型或参数的个数。 基本上,它在派生类或子类中重新定义了基类方法。

说说TS中的类及其特性