TypeScript
认识 TypeScript
类型缺失的 JavaScript
-
其实上由于各种历史因素,JavaScript 语言本身存在很多的缺点
- 随着 ECMAScript 不断提出的新特性,让这门语言更加现代、更加安全、更加方便
- 然而到目前为止,JavaScript 在类型检测上依然是毫无进展
-
缺失类型带来的问题
- 无法在代码编译期间就发现代码错误,许多错误必须要等到代码执行时才能发现
- 对于工具/框架的开发者,无法给使用者提供类型提示,还需要对各种错误边界进行处理
- 尤其是对于 JavaScript 这一单线程语言而言,错误会导致后续的代码都无法执行
-
为了弥补 JavaScript 类型约束上的缺陷,许多公司推出了自己的方案
-
2014 年,Facebook 推出了 flow 来对 JavaScript 进行类型检查
-
同年,Microsoft 也推出 了 TypeScript 1.0 版本
-
目前,TypeScript 已经成为了最为流行的 JavaScript 超集
-
定义和特点
定义
- 官方定义:TypeScript is JavaScript with syntax for types
- TypeScript 是拥有类型的 JavaScript 超集
特点
-
始于 JavaScript,归于 JavaScript
- 基于 JavaScript 进行构建,包含 JavaScript 的所有语法特性
- 可以编译成普通、干净、完整的 JavaScript 代码
-
拥有先进的 JavaScript
- 包含 ECMAScript 和 未来提案 中的特性
- 对原有的 JavaScript 进行了语法扩展,同时也可以编译成向下兼容的代码
-
是一个强大的工具,用于构建大型项目
-
静态语法分析可以实时分析代码错误
-
类型是可选的,强大的类型推导能力
-
运行环境
-
方式一:使用
ts-node工具(Node.js 环境)# 对于 ts-node 工具包,全局安装即可
npm i -g ts-node tslib @types/node
# 运行 ts 文件
ts-node index.ts -
方式二:使用
webpack搭建环境(浏览器环 境)import { resolve } from "path";
import { Configuration } from "webpack";
import HtmlWebpackPlugin from "html-webpack-plugin";
const config: Configuration = {
mode: "development",
devtool: "source-map",
entry: "./src/index.ts",
output: {
filename: "bundle.js",
path: resolve(__dirname, "./build")
},
module: {
rules: [
{
test: /\.ts$/,
use: "ts-loader"
}
]
},
resolve: {
extensions: [".ts", "..."]
},
plugins: [
new HtmlWebpackPlugin({
template: resolve(__dirname, "./index.html")
})
]
};
export default config;
变量声明
类型注解
-
在 TypeScript 定义变量(标识符)和 ES6 之后一致,可以使用
var/let/const来定义 -
在 TypeScript 中定义变量需要指定标识符的类型
-
声明类型后就会开启 类型检测,声明的类型可以称之为类型注解
-
完整的声明格式
var/let/const 标识符: 数据类型 = 赋值; -
TSLint 不推荐使用
var来声明变量
-
-
在 TypeScript 中的类型声明与 JavaScript 中数据的包装类型是两个不同的概念
/*
* string: TypeScript中字符串的类型
* String: JavaScript中字符串的包装类
*/
const str: string = 'Hello, TypeScript!';
类型推导
-
变量初始化值时,TypeScript 会根据初始化的值进行类型推导,自动推导出变量的类型
/*
* message 变量会自动推导为 string 类型
*/
let message = "Hello World!";
// Error: 不能将类型“number”分配给类型“string”
message = 22; -
使用
let声明推导出来的类型比const更为宽泛
/*
* message 变量推导为 string 类型
*/
let message = "Hello World";
/*
* age 变量推导为字面量类型 18
*/
const age = 18;