首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【TypeScript】超详细的笔记式教程【上】

【TypeScript】超详细的笔记式教程【上】

作者头像
HoMeTown
发布于 2022-10-26 00:31:34
发布于 2022-10-26 00:31:34
1.3K00
代码可运行
举报
运行总次数:0
代码可运行

前言

之前了解过TypeScript,也学习过,但是项目中没有具体的使用过,导致忘得差不多了,最近公司不是很忙,学习的时间比较多,趁这个机会,快快的过一遍,然后准备用SolidJs + TypeScript + Vite做一个小项目,还看了看SvelteJs,感觉这个比SolidJs的生态似乎更好,可以巩固完TypeScript后学习一下这个,SvelteJs + Ts + Vite也挺香嘛。

TypeScript

Typed JavaScript at Any Scale. 添加了类型系统的 JavaScript,适用于任何规模的项目。

安装

执行命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
npm install typescript -g

检查是否安装成功:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tsc

看到这个,说明成功了👇🏻

Hello World

本地新建文件hello.ts,开始写代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function sayHelloWorld(person: string) {
    return name + ' hello world'
}
console.log(sayHelloWorld("Alice"))

执行tsc hello.ts进行编译,会出现一个新的文件hello.js,此时我们执行如下命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
node hello.js

正常输出 Alice hello world,成功!

上述的Ts栗子中有一个点,就是:指定类型。

注意: Ts只会在编译与书写代码的过程中给你相关的警告,在Js的执行中并不会有这样的警告,编译完的Js代码也不会插入相关的校验代码。

如果我们在调用sayHelloWorld的时候,传入一个123,会出现以下情况:

情况一:编辑器会有提示,这时候看到提示,我们就可以修改代码。

情况二:如果没有修改代码,强制编译,过程中会抛出这个错误

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Argument of type 'number' is not assignable to parameter of type 'string'.
类型“number”不能分配给类型"string"的参数.

但是js文件依旧会编译成功,如果想要报错终止编译,那么需要配置tsconfig.json中的noEmitOnError

tsconfig.json

这个文件是Ts的编译选项配置文件,具体配置可以参考这里

不带任何输入文件的情况下调用tsc编译器会从当前目录开始去查找tsconfig.json文件,逐级向上搜索父目录。

生成tsconfig.json

在项目根目录执行

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tsc --init

即可生成一个tsconfig.json文件,里面有好多配置,我们来测试一个

我在这打开了删除注释的配置,然后在hello.ts中新增一行注释

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function sayHelloWorld(name: string) {
  return name + "hello world111";
}

console.log(sayHelloWorld(1231212));
// 我是一行注释

执行tsc编译,hello.js文件如下👇🏻

同样的,我们刚刚说的那个noEmitOnError也是可以生效的,成功!

这里放一个配置表:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"compilerOptions": {
  "incremental": true, // TS编译器在第一次编译之后会生成一个存储编译信息的文件,第二次编译会在第一次的基础上进行增量编译,可以提高编译的速度
  "tsBuildInfoFile": "./buildFile", // 增量编译文件的存储位置
  "diagnostics": true, // 打印诊断信息 
  "target": "ES5", // 目标语言的版本
  "module": "CommonJS", // 生成代码的模板标准
  "outFile": "./app.js", // 将多个相互依赖的文件生成一个文件,可以用在AMD模块中,即开启时应设置"module": "AMD",
  "lib": ["DOM", "ES2015", "ScriptHost", "ES2019.Array"], // TS需要引用的库,即声明文件,es5 默认引用dom、es5、scripthost,如需要使用es的高级版本特性,通常都需要配置,如es8的数组新特性需要引入"ES2019.Array",
  "allowJS": true, // 允许编译器编译JS,JSX文件
  "checkJs": true, // 允许在JS文件中报错,通常与allowJS一起使用
  "outDir": "./dist", // 指定输出目录
  "rootDir": "./", // 指定输出文件目录(用于输出),用于控制输出目录结构
  "declaration": true, // 生成声明文件,开启后会自动生成声明文件
  "declarationDir": "./file", // 指定生成声明文件存放目录
  "emitDeclarationOnly": true, // 只生成声明文件,而不会生成js文件
  "sourceMap": true, // 生成目标文件的sourceMap文件
  "inlineSourceMap": true, // 生成目标文件的inline SourceMap,inline SourceMap会包含在生成的js文件中
  "declarationMap": true, // 为声明文件生成sourceMap
  "typeRoots": [], // 声明文件目录,默认时node_modules/@types
  "types": [], // 加载的声明文件包
  "removeComments":true, // 删除注释 
  "noEmit": true, // 不输出文件,即编译后不会生成任何js文件
  "noEmitOnError": true, // 发送错误时不输出任何文件
  "noEmitHelpers": true, // 不生成helper函数,减小体积,需要额外安装,常配合importHelpers一起使用
  "importHelpers": true, // 通过tslib引入helper函数,文件必须是模块
  "downlevelIteration": true, // 降级遍历器实现,如果目标源是es3/5,那么遍历器会有降级的实现
  "strict": true, // 开启所有严格的类型检查
  "alwaysStrict": true, // 在代码中注入'use strict'
  "noImplicitAny": true, // 不允许隐式的any类型
  "strictNullChecks": true, // 不允许把null、undefined赋值给其他类型的变量
  "strictFunctionTypes": true, // 不允许函数参数双向协变
  "strictPropertyInitialization": true, // 类的实例属性必须初始化
  "strictBindCallApply": true, // 严格的bind/call/apply检查
  "noImplicitThis": true, // 不允许this有隐式的any类型
  "noUnusedLocals": true, // 检查只声明、未使用的局部变量(只提示不报错)
  "noUnusedParameters": true, // 检查未使用的函数参数(只提示不报错)
  "noFallthroughCasesInSwitch": true, // 防止switch语句贯穿(即如果没有break语句后面不会执行)
  "noImplicitReturns": true, //每个分支都会有返回值
  "esModuleInterop": true, // 允许export=导出,由import from 导入
  "allowUmdGlobalAccess": true, // 允许在模块中全局变量的方式访问umd模块
  "moduleResolution": "node", // 模块解析策略,ts默认用node的解析策略,即相对的方式导入
  "baseUrl": "./", // 解析非相对模块的基地址,默认是当前目录
  "paths": { // 路径映射,相对于baseUrl
    // 如使用jq时不想使用默认版本,而需要手动指定版本,可进行如下配置
    "jquery": ["node_modules/jquery/dist/jquery.min.js"]
  },
  "rootDirs": ["src","out"], // 将多个目录放在一个虚拟目录下,用于运行时,即编译后引入文件的位置可能发生变化,这也设置可以虚拟src和out在同一个目录下,不用再去改变路径也不会报错
  "listEmittedFiles": true, // 打印输出文件
  "listFiles": true// 打印编译的文件(包括引用的声明文件)
}

基础

数据类型

布尔值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let isOk: boolean = true

数值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let age: number = 18
let notANumber: number = NaN

字符串

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let name: string = "Alice"
let age: number = 18
let sentence: string = `I from China Beijing, my name is ${name}, age ${age}`

空值

Js中没有Void的概念,Ts中可以用void表示没有任何返回值的函数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function alertHello(): void {
    alert('hello')
}

null & undefiled

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let u: undefined = undefined
let n: null = null

注意

有一个点需要注意一下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let isOk: boolean = new Boolean('')

这样也会抛出错误不能将类型“Boolean”分配给类型“boolean”。,因为new T返回的是一个T对象,👇🏻

任意值

Any表示你的变量可以是任何值,Ts -> Js。。。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let anyVar: any = '121'
anyVar = true

完全ok,如果是👆🏻上面说的声明定式的类型,那么是不行的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let name: string = 'alice'
name = true

抛出错误不能将类型“number”分配给类型“string”。

类型推论

如果你的变量没有赋值,那么TypeScript会看你后面的值是啥类型,那你这个变量就是啥类型

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let age = 12 // === let age: number = 12
age = '12'

抛出错误不能将类型“string”分配给类型“number”。

需要注意📢的是,如果你没有初始化变量,那就是any类型

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let age;
age = 1
age = true

这样完全Ok,并不会抛出错误,这样写类似于:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let age: any;

联合类型

联合类型就是一个变量可以有多个类型,举个🌰

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let isWhat: string | number | boolean;
isWhat = '1'
isWhat = 1
isWhat = true

完全Ok,但是如果这样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
isWhat = [1,2,3]

就会抛出错误不能将类型“number[]”分配给类型“string | number | boolean”

再举一个例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function getLength(something: string | number): number {
    return something.length
}

这样写就会抛出错误类型“number”上不存在属性“length”。length不是他们的共有属性,所以会报错,改成这样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function getString(something: string | number): string {
    return something.toString()
}

完全Ok!

接口

基本定义

interface是对行为的抽象,举个🌰:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
interface Person {
    name: string;
    age: number;
}
let alice: Person = {
    name: 'Alice',
    age: 18
}

上面的栗子,变量alice的结构必须与接口Person相一致,如果我们不写age,那么就会抛出错误类型 "{ name: string; }" 中缺少属性 "age",但类型 "Person" 中需要该属性。

所以定义的变量的属性,比接口定义的少是不被允许的,当然!多了也是不允许的,必须一致!

比如我们在变量alice添加属性address,那么就会抛出错误不能将类型“{ name: string; age: number; address: string; }”分配给类型“Person”。\ 对象文字可以只指定已知属性,并且“address”不在类型“Person”中。

可选属性

如果我们需要某个属性不是必须一致,那么可以这么做,继续用上面的栗子,假设age为不必要属性:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
interface Person {
    name: string;
    age?: number;
}
let alice: Person = {
    name: 'Alice'
}

完全Ok

任意属性

如果我们需要在变量中定义一些我们将来可能会添加的属性,有极大的不确定性的话,比如我们想要新增一个address属性,那么我们可以这样:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
interface Person {
    name: string;
    age?: number;
    [propName: string]: any
}
let alice: Person = {
    name: 'Alice',
    address: 'China Beijing',
    gender: 0
}

完全OK!

只读属性

有时候我们需要一个属性不能再被修改,需要用到readonly定义属性,举个🌰

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
interface Person {
    readonly id: number;
    name: string;
    [propName: string]: any;
}
let alice: Person = {
    id: 1,
    name: 'Alice',
    gender: 0
}
alice.id = 2
// error: 无法分配到 "id" ,因为它是只读属性。
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-04-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 秃头开发头秃了 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【初学者笔记】🐯年要掌握 Typescript
JavaScript 是弱类型语言, 很多错误只有在运行时才会被发现,而 TypeScript 提供了一套静态检测机制, 可以帮助我们在编译时就发现错误。
一尾流莺
2022/12/10
1.4K0
【初学者笔记】🐯年要掌握 Typescript
【TypeScript】002-安装 TypeScript 与 Hello TypeScript 入门程序
以上命令会在全局环境下安装 tsc 命令,安装完成之后,我们就可以在任何地方执行 tsc 命令了。
訾博ZiBo
2025/01/06
2840
【TypeScript】002-安装 TypeScript 与 Hello TypeScript 入门程序
【TypeScript 4.5】002-第 2 章 TypeScript 入门
关闭严格模式,类型隐式推断为 any 类型,也就回到了普通的 js 代码的效果了,与是否使用 ts 无区别!我们可以 strict 严格模式,我们呢也可以将 noImplicitAny 设置为 true。
訾博ZiBo
2025/01/06
1860
【TypeScript 4.5】002-第 2 章 TypeScript 入门
Typescript学习笔记,从入门到精通,持续记录
TypeScript 最大的优势之一便是增强了编辑器和 IDE 的功能,包括代码补全、接口提示、跳转到定义、重构等。
房东的狗丶
2023/02/17
2.2K0
TypeScript 基础学习
TypeScript和其他的区别和好处在哪里我就不说了,既然选择学习它,就一定有它的优点
炒香菇的书呆子
2022/04/13
7130
TypeScript 基础学习
TypeScript学习笔记(三)—— 编译选项、声明文件
compilerOptions ⽀持很多选项,常⻅的有 baseUrl 、 target 、 moduleResolution 和 lib 等。 compilerOptions 每个选项的详细说明如下:
张果
2022/10/04
2.9K0
TypeScript学习笔记(三)—— 编译选项、声明文件
Typescript基础语法
typescript是一个js的超集,个人理解为包装了面向对象编程逻辑的语法糖,所以一般使用typescript的语言来编写代码,然后再使用typescript编译为原生js,这样就可以作为普通js脚本运行了。typescript语法很多地方与java类似,作为java程序员学起来不会很吃力。
歪歪梯
2020/06/19
1.7K0
深入浅出 TypeScript
本文是阅读小册 「《深入浅出 TypeScript》」 的阅读笔记,对TypeScript感兴趣的同学请继续阅读吧。
chuckQu
2022/08/19
3.1K0
TypeScript 超详细入门讲解
当我们需要将 unknown 类型的变量赋值给其他类型的变量的时候,我们可以给他指定类型
小丞同学
2021/10/08
8030
深度讲解TS:这样学TS,迟早进大厂【03】:简单的例子 helloworld
在 TypeScript 中,我们使用 : 指定变量的类型,: 的前后有没有空格都可以。
江一铭
2022/06/17
3250
TypeScript 类型体操 - 实践
像 JS 引擎那些 api,还有浏览器提供的 api,这些基本是必用的,而且都有标准的。所以 TypeScript 给内置了它们的类型声明。
Cellinlab
2023/05/17
3700
会写 TypeScript 但你真的会 TS 编译配置吗?
随着 TypeScript 的流行,越来越多的项目通过使用 TypeScript 来实现编写代码时候的类型提示和约束,从开发过程中减少 BUG 出现的概率,以此提升程序的健壮性和团队的研发效率。
小东同学
2022/07/29
4.5K1
会写 TypeScript 但你真的会 TS 编译配置吗?
TypeScript系列教程十二《编译配置》
TypeScript 执行tsc 操作进行编译时根据编译配置来执行的,编译配置可以设计编译属性影响输出结果。
星宇大前端
2022/05/06
1.2K0
深入浅出TypeScript | 青训营笔记
TS(TypeScript)是一种由Microsoft开发和维护的编程语言,它是JavaScript的超集,支持静态类型检查、类、接口、泛型等特性。TS最终会被编译为标准的JavaScript代码,因此可以运行在任何支持JavaScript的环境中。
心安事随
2024/07/29
3480
深入浅出TypeScript | 青训营笔记
TypeScript 工程化的实践方案
JavaScript代码可以直接被浏览器执行,而TypeScript则需要编译后才能被执行,比如使用tsc命令编译。但这就会显得很麻烦,每次都要运行命令,编译后才能被执行。而且项目里不止写一个TypeScript文件,如果有多个ts文件,我们一个一个去编译那也太麻烦了。所以下面就来学习TypeScript的编译选项和tsconfig.json配置选项。
害恶细君
2022/11/22
1K0
TypeScript 工程化的实践方案
TypeScript 官方手册翻译计划【一】:基础
JavaScript 中的每个值会随着我们执行不同的操作表现出一系列的行为。这听起来很抽象,看下面的例子,考虑一下针对变量 message 可能执行的操作:
玖柒的小窝
2021/11/16
1K0
前端入门25-福音 TypeScript声明正文-TypeScript
今天来讲讲有 Java 基础转 JavaScript 的福音:TypeScript
请叫我大苏
2018/12/27
3.4K0
【One by one系列】一步步学习TypeScript
想弯道超车吗!?快速追上前端潮流吗!?那么开始使用ts或许是个选择,当然这有一点急功近利,不提倡。
DDGarfield
2022/06/23
7420
TypeScript基础总结
编辑器首选MS自家开发的VS Code (推荐)。当然,Webstorm在2016年2月推出的版本内置了TS编译器,atom 需要安装 atom-typescript包,sublime需要安装Typescript-sublime-plugin。
腾讯IVWEB团队
2020/06/24
1.1K0
了不起的 tsconfig.json 指南
在 TypeScript 开发中,tsconfig.json 是个不可或缺的配置文件,它是我们在 TS 项目中最常见的配置文件,那么你真的了解这个文件吗?它里面都有哪些优秀配置?如何配置一个合理的 tsconfig.json 文件?本文将全面带大家一起详细了解 tsconfig.json 的各项配置。
pingan8787
2020/06/02
2.9K0
相关推荐
【初学者笔记】🐯年要掌握 Typescript
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档