TypeScript 开发或面试中常见问题合集

目录

  • typescript 与 babel 区别
    • 编译
    • 编译器
  • 模块
    • 模块解析规则
  • 命名空间
  • interface 合并逻辑
    • 声明合并
  • 普通项目怎么从 js 迁移到 ts
    • 解决冲突
  • 第三方工具生成`.d.ts`文件
  • 三斜线指令
  • 模块解析逻辑
  • types 发布
  • 书写 ts 的声明文件
    • Property 'includes' does not exist on type 'number[]'
  • global 申明


在这里插入图片描述

正文开始如果觉得文章对您有帮助,请帮我三连+订阅,谢谢💖💖💖


typescript 与 babel 区别

编译

TypeScript 早已能像 Babel 一样输出 ES5 代码,可通过将 target 设置为 ES5 或 ES6 来实现。但 Babel 配置通过 @babel/preset-env改进了这方面功能。你可以列出需要支持的环境,而不是锁定一组特定的 JavaScript 功能(ES5,ES6 等)
Babel 是超级可配置的
想要 JSX? Flow?TypeScript?只需安装一个插件,Babel 就可以处理它。有大量的 官方插件,主要涵盖即将推出的 JavaScript 语法。

编译器

ts 需要用自己的 tsc ,tsc 不支持很多还在草案阶段的语法,这些语法都是通过 babel 插件来支持的
babel 下一代的 js 编译器,无论你的代码是否具有 ES2015、JSX、TypeScript 都能编译

模块

TypeScript 1.5 里术语名已经发生了变化。 “内部模块”现在称做“命名空间”。 “外部模块”现在则简称为“模块”,也就是说 module X { 相当于现在推荐的写法 namespace X {)。

任何包含顶级 import 或者 export 的文件都被当成一个模块。相反地,如果一个文件不带有顶级的 import 或者 export 声明,那么它的内容被视为全局可见的

  • 为了支持 CommonJS 和 AMD 的 exports, TypeScript 提供了 export = 语法。
  • 若使用 export =导出一个模块,则必须使用 TypeScript 的特定语法 import module = require("module")来导入此模块。
// 外部模块
declare module '*vue' {import Vue from 'vue'export default Vue
}declare module "*.scss";
// 全局模块
// 默认.d.ts 的内容就是全局的, 模块下的想全局,  必须得 import export 去标识模块
declare global {function hello2(s: string): voidnamespace JSX {export interface Element {}}
}export {}  // 使文件模块化

模块解析规则

// A.ts 文件路径: /root/src/folder/A.ts
import { b } from "moduleB"
//去寻找声明的路径
/root/src/folder/moduleB.ts
/root/src/folder/moduleB.d.ts
/root/src/moduleB.ts
/root/src/moduleB.d.ts
/root/moduleB.ts
/root/moduleB.d.ts
/moduleB.ts
/moduleB.d.ts

命名空间

使用命名空间(之前叫做“内部模块”)来组织你的代码,让代码提示性更好,主要体现组织代码
例如验证器、 D3

namespace Validate {export interface BooleanValidate {}}namespace Validate {export interface StringValidate {}
}declare let vv: Validate.StringValidate// 实例代码
let v3 : Validate.StringValidate = {}
let v4 : typeof vv = {}

interface 合并逻辑

声明合并

interface Cloner {clone(animal: Animal): Animalclone(animal: Dog): Animal
}interface Cloner {clone(animal: Sheep): Sheep
}// 结果
interface Cloner {clone(animal: Sheep): Sheep // 后来的具有最高优先级clone(animal: Animal): Animalclone(animal: Dog): Animal
}

普通项目怎么从 js 迁移到 ts

  1. tsc --init , 生成 tsconfig.json
  2. 配置 tsconfig.json , allowJs 、 outDir, 上线就用 outDir 里的文件
  3. 将文件的后缀修改为 .ts .tsx

解决冲突

  1. 增加一些声明文件
// xx.d.ts
declare function require(path: string): any;
  1. 配合配置文件中的 module 属性,修改模块导入导出
// commonjs
var foo = require("foo");
foo.doStuff();// requirejs
define(["foo"], function(foo) {foo.doStuff();
})// 全部换成 ts的模块导入
import foo = require("foo");foo.doStuff();
  1. 获取一些库的@types : @types/lodash

第三方工具生成.d.ts文件

  • dts-gen
// 整包生成
npm install -g dts-gen   // 先全局安装dts-gen
npm install -g yargs     // 然后在全局安装你需要生产声明文件的库
dts-gen -m yargs         // 执行命令生成文件// 单文件生成
npm i dtsmake -g   // 先全局安装dtsmake
dtsmake -s ./path/to/sourcefile.js  // 在对应的文件生产文件

三斜线指令

  1. 三斜线指令可放在包含它的文件的最顶端

  2. 它用于声明文件间的 依赖。告诉编译器在编译过程中要引入的额外的文件

/// <reference path="..." />   标识依赖路径
/// <reference types="..." />  声明了对某个包的依赖。例如,把 /// <reference types="node" />引入到声明文件,表明这个文件使用了 @types/node/index.d.ts里面声明的名字; 并且,这个包需要在编译阶段与声明文件一起被包含进来。仅当在你需要写一个d.ts文件时才使用这个指令。

模块解析逻辑

两种模式: classic  &&  Node
classic :相对:在当前路径下找  .ts  .d.ts非相对: 一层一层的向上找  .ts  .d.ts
node:node本身查找原理:相对:1. 当前给的路径找 .js 后缀结尾的文件2. 路径下找 package.json -> main 属性3. 路径下是否有index.js非相对:从当前一层一层的向上查找(node_modules)是否有这个文件typescript原理:1. 后缀:.ts  .tsx .d.ts2. package.json -> types/typings 属性3. 查找方式就是  1+2+ 模式

types 发布

1.与你的npm包捆绑在一起,或
2.发布到npm上的@types organization。
注意"typings""types"具有相同的意义,也可以使用它。
dependencies or devDependencies?
如果我们只是在写一个命令行应用,并且我们的包不会被当做一个库使用的话,那么我就可以使用 devDependencies。
3.不要在声明文件里使用/// <reference path="..." />。应该使用/// <reference types="..." />代替

书写 ts 的声明文件

1.全局变量
2.全局函数
3.带属性的对象  namespace
4.函数重载  // 声明多个签名不一样的函数
5.可重用类型(接口) // 必填/选填 属性
6.可重用类型(类型别名)  // 接受 字符串 / 函数返回字符串 / 一个实例对象type GreetingLike = string | (() => string) | MyGreeter;declare function greet(g: GreetingLike): void;
7.组织类型 + 类// 声明declare namespace GreetingLib {interface LogOptions {verbose?: boolean}interface AlertOptions {modal: booleantitle?: stringcolor?: string}}declare class Greeter {constructor (s: string)log: (val: GreetingLib.LogOptions) => voidalert: (val: GreetingLib.AlertOptions) => void}

Property ‘includes’ does not exist on type ‘number[]’

当 tsc 后面跟文件的时候,不会 使用 tsconfig.json

global 申明

// declare global
+ 在 d.ts 声明文件中,任何的 declare 默认就是 global 的了,所以你在 d.ts 文件中是不能出现 declare global 的。
+ 只有在模块文

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/381855.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RSA非对称加密

前言 RSA是一种非对称加密算法&#xff0c;也是目前最常用的加密算法之一。它由三位发明家&#xff08;Rivest、Shamir、Adleman&#xff09;于1977年提出&#xff0c;并以他们的姓氏命名。RSA算法使用了两个密钥&#xff1a;公钥和私钥。公钥可用于对数据进行加密&#xff0c…

《Exploring Aligned Complementary Image Pair for Blind Motion Deblurring》

这篇论文的标题《Exploring Aligned Complementary Image Pair for Blind Motion Deblurring》可以翻译为《探索对齐的互补图像对用于盲运动去模糊》。从标题可以推断,论文的焦点在于开发一种算法或技术,利用成对的图像来解决运动模糊问题,特别是在不知道模糊核(即造成模糊…

第一弹:基于ABAP OLE技术实现对服务器文件进行读写操作

前言 最近遇到这样一个需求&#xff0c;需要对BW服务器上的文件进行下载的同时写入每个用户相对应的数据。之前的服务器模版是一个死模版&#xff0c;对于这样的要求&#xff0c;我就想到了OLE技术&#xff0c;那么什么是OLE技术呢&#xff1f; 一、什么是OLE技术&#xff1f…

Modbus转BACnet/IP网关快速对接Modbus协议设备与BA系统

摘要 在智能建筑和工业自动化领域&#xff0c;Modbus和BACnet/IP协议的集成应用越来越普遍。BA&#xff08;Building Automation&#xff0c;楼宇自动化&#xff09;系统作为现代建筑的核心&#xff0c;需要高效地处理来自不同协议的设备数据&#xff0c;负责监控和管理建筑内…

深入浅出mediasoup—通信框架

libuv 是一个跨平台的异步事件驱动库&#xff0c;用于构建高性能和可扩展的网络应用程序。mediasoup 基于 libuv 构建了包括管道、信号和 socket 在内的一整套通信框架&#xff0c;具有单线程、事件驱动和异步的典型特征&#xff0c;是构建高性能 WebRTC 流媒体服务器的重要基础…

使用 spring MVC 简单的案例 (1)计算器

一、计算器 1.1前端代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> …

Git报错fatal: detected dubious ownership in repository

报错信息 fatal: detected dubious ownership in repository at 解决办法 一行代码解决 git config --global --add safe.directory "*";如何使用git工具初始胡项目并且和远程仓库建立联系 git init–建立一个本地仓库 git add README.md–将README.md文件加入…

MySQL添加索引时会锁表吗?

目录 简介Online DDL概念Online DDL用法总结 简介 在MySQL5.5以及之前的版本&#xff0c;通常更改数据表结构操作&#xff08;DDL&#xff09;会阻塞对表数据的增删改操作&#xff08;DML&#xff09;。 MySQL5.6提供Online DDL之后可支持DDL与DML操作同时执行&#xff0c;降低…

算法通关:005对数器

就是你有优解&#xff0c;但是不知道对不对&#xff0c;或者你遇到了题&#xff0c;但是没有在线网站能跑&#xff0c;无法检查你的思路是否正确。 写一个随机生成符合输入要求的方法。 此时用暴力解法写一个&#xff0c;因为答案肯定是对的&#xff0c;再写一个优解方法。将两…

斐波那契数列的多种解法 C++实现,绘图部分用Python实现

斐波那契数列的多种解法 C实现&#xff0c;绘图部分用Python实现 flyfish 斐波那契数列&#xff08;Fibonacci sequence&#xff09;是一个经典的数列&#xff0c;定义如下&#xff1a; { 0 if n 0 1 if n 1 F ( n − 1 ) F ( n − 2 ) if n > 1 \begin{cases} 0 &…

HackTheBox--Knife

Knife 测试过程 1 信息收集 端口扫描 80端口测试 echo "10.129.63.56 knife.htb" | sudo tee -a /etc/hosts网站是纯静态的&#xff0c;无任何交互功能&#xff0c;检查网页源代码也未发现任何可利用的文件。 检查页面请求时&#xff0c;请求与响应内容&#xff0…

高频面试题-CSS

BFC 介绍下BFC (块级格式化上下文) 1>什么是BFC BFC即块级格式化上下文&#xff0c;是CSS可视化渲染的一部分, 它是一块独立的渲染区域&#xff0c;只有属于同一个BFC的元素才会互相影响&#xff0c;且不会影响其它外部元素。 2>如何创建BFC 根元素&#xff0c;即HTM…

RabbitMQ的学习和模拟实现|sqlite轻量级数据库的介绍和简单使用

SQLite3 项目仓库&#xff1a;https://github.com/ffengc/HareMQ SQLite3 什么是SQLite为什么需要用SQLite官方文档封装Helper进行一些实验 什么是SQLite SQLite是一个进程内的轻量级数据库&#xff0c;它实现了自给自足的、无服务器的、零配置的、事务性的 SQL数据库引擎…

lua 游戏架构 之 LoaderWallet 异步加载

定义了一个名为LoaderWallet class&#xff0c;用于管理资源加载器&#xff08;Loader&#xff09;。这个类封装了资源加载的功能&#xff0c;包括异步加载&#xff0c;以及资源的释放和状态查询。下面是对代码的详细解释&#xff1a; ### 类定义和初始化 这里定义了一个名为…

Inconsistent Query Results Based on Output Fields Selection in Milvus Dashboard

题意&#xff1a;在Milvus仪表盘中基于输出字段选择的不一致查询结果 问题背景&#xff1a; Im experiencing an issue with the Milvus dashboard where the search results change based on the selected output fields. Im working on a RAG project using text data conv…

AndroidStudio 编辑xml布局文件卡死问题解决

之前项目编写的都是正常&#xff0c;升级AndroidStudio后编辑布局文件就卡死&#xff0c;还以为是AndroidStudio文件。 其实不然&#xff0c;我给整个项目增加了版权声明。所以全部跟新后&#xff0c;布局文件也增加了版权声明。估计AndroidStudio在 解析布局文件时候因为有版…

推荐丨SSL证书是什么?该怎么申请,需要准备哪些材料?

SSL证书是什么&#xff1f; SSL证书&#xff08;Secure Sockets Layer Certificate&#xff09;&#xff0c;又称为数字证书&#xff0c;是一种用于在互联网上验证网站身份和加密通信的技术。它遵守SSL协议&#xff0c;由受信任的数字证书颁发机构&#xff08;CA&#xff09;在…

在 CI/CD Pipeline 中实施持续测试的最佳实践!

随着软件开发周期的不断加快&#xff0c;持续集成&#xff08;CI&#xff09;和持续交付/部署&#xff08;CD&#xff09;已经成为现代软件开发的重要组成部分。在这一过程中&#xff0c;持续测试的实施对于确保代码质量、提高发布效率至关重要。本文将详细介绍在CI/CD流水线中…

STM32高级运动控制系统教程

目录 引言环境准备高级运动控制系统基础代码实现&#xff1a;实现高级运动控制系统 4.1 传感器数据采集模块 4.2 数据处理与运动控制模块 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景&#xff1a;运动控制与优化问题解决方案与优化收尾与总结 1. 引言 高级运动…

深入理解Linux网络(五):TCP接收唤醒

深入理解Linux网络&#xff08;五&#xff09;&#xff1a;TCP接收唤醒 TCP接收唤醒由软中断提供服务。 软中断&#xff08;也就是 Linux ⾥的 ksoftirqd 进程&#xff09;⾥收到数据包以后&#xff0c;发现是 tcp 的包的话就会执⾏到 tcp_v4_rcv 函数。接着如果是 ESTABLISH…