TS在js的基础上添加了很多java语言的特征
全局安装:
typescript: npm install -g typescript
执行ts文件: npm i -g ts-node
生成tsconfig.json
配置文件:tsc -init
1. 用VSCode创建一个.ts文件
文章图片
2. 强类型–为变量指定变量类型
var uname:string
uname = "1"
uname = null//no
uname = undefined//no
uname = 1//no
uname = {}//no
uname = []//no
uname = function(){}//no
var uname:string
uname = "1"
function a(uname:string){ //给形参显示指定类型
return uname.split("");
}
a('qwe')//自动监测参数类型是否匹配
文章图片
3. ts文件在浏览器上无法运行,需要执行ts命令:
tsc 01.ts
ts会检测【同时打开的】文件中 是否存在命名冲突
文章图片
4. 基础数据类型
var a:null
a = nullvar b:undefined
b = void 0var c:string
c = 1+""var d:number
d = Math.PI
d = Number.MAX_SAFE_INTEGER
d = 2 ** 24
var e:any //任意类型
e = {}
e = []var f: string | boolean //混合类型
f = `${a}`
f = true
5. 数组类型
//规定数组元素类型 为 number
//基础写法-01
var TS_arr:Array = [1,2,3,4,null,undefined]
//基础写法-02
var TS_arr:number[] = [1,2,3,4]
//多类型
var TS_arr:(number | string |null | undefined)[] = [1,2,3,4,null,undefined]//数组对象写法 -01
var cc:{a:number,b:string}[] = [
{a:1,b:"aaac"},
{a:3,b:"cccc"}
]
//数组对象写法 -02
type t = {a:number,b:string}
var cc:t[] = [
{a:1,b:"aaac"},
{a:3,b:"cccc"}
]
//数组对象写法 -03
class t{
a:number
b:string
}
var cc:t[] = [
{a:1,b:"aaac"},
{a:3,b:"cccc"}
]
6. 接口
interface ts_json {
a:boolean,
b:string,
c?:number, // 加了问号代表 c属性可以不写
[propname:string]:any, //写任何属性不被约束 (属性名是string类型属性值是任何类型)
say():string, // 必须有say方法而且返回值是string类型
}//对对象字面量进行约束
var ts_json_01:ts_json = {
a:true,
b:"",
c:1,
d:true,
e:undefined,
say() {
return "返回值是接口中定义的string类型"
},
}//对 类进行约束
class A implements ts_json{
a = true
b = ""
c = 1
say(){
return "返回值是接口中定义的string类型"
}
}//接口继承
interface ts_son extends ts_json{
www() : string
}class B implements ts_son{
a = true
b = ""
c = 1
say(){
return "返回值是接口中定义的string类型"
}
www(){
return "ts_son继承了 ts_json 所以这个类不仅得接受 ts_json接口的约束 还得添加一个 ts_son中约束的 www方法"
}
}console.log(ts_json_01);
7. 对象类型
//接口约束对象
interface ts_json {
a:boolean,
b:string,
c?:number, // 加了问号代表 c属性可以不写
}
var ts_json_01:ts_json = {
a:true,
b:"",
}
console.log(ts_json_01);
//另一种写法
const aa: {
a:boolean,
b:string,
c:number,
} = {
a:true,
b:"",
c:123,
}
console.log(aa);
8. 类修饰符
public
protected
private
class Limit{
public a=1 //实例化对象可用
protected b=2 // 类以及子类内部可用
private c=3 // 当前类内部可用
}
//ts定义一个类
const a :Limit = new Limit();
console.log(a.a)
9. 类型注解 类型推断
//类型注解:手动添加变量的类型
//类型推断:程序可以推断一部分变量的类型 所以可以不用特意添加
let a = 1;
a = "" //报错
10. 函数参数类型和返回类型检测
//有返回值写法
let a = 1;
function aa(b:number):number{//防止类型意外变更
return b
}
aa(a)
//无返回值写法
function aa(b:number):void{//防止代码中出现return语句单写一个 return不会出错
console.log(b+"")
return "";
//报错
}
aa(a)
//执行死循环
let a = 1;
function aa(b:number):never{//让函数一直执行
throw new Error()
}
function bb(b:number):never{//让函数一直执行
while(true){}
}//参数是对象
function a({aa}:{aa:number}){
return aa
}
a({aa:1})
11. 元组 解决数组类型与元素对应的顺序不同
//一维数组
const arr :[string,number] = ["",1]
//二维数组
const arr :[string,number][] = [
["",1],
["",1]
]
12. ts 类的 static getter setter
class A {
readonly b :string = "readonly关键字 设置属性只读"
constructor(private _a:string){} //在构造函数内 定义一个 _a 属性简化了定义属性的写法
get a(){ // getter
return this._a + "_get"
}
set a(val){ // setter
this._a = val + "_set"
}
static saw(){//定义静态方法 直接通过类名 . 方法名调用 不用再实例化对象
console.log("saw方法")
}
}
let aa = new A("sss")
aa.a = "修改a__"
//aa.b = "修改b属性" //报错
console.log(aa.a)
//调用静态方法
A.saw()
13. ts 抽象类
//abstract 关键字定义抽象类和 抽象方法
abstract class A{
abstract sss():any
}
class B extends A{
sss() {
console.log("B类需要定义 sss的方法体");
}
}
14. tsconfig.json 文件常用 配置 把注释解开即可
{
"include": ["01.ts"], //只编译 01.ts
"exclude": ["02.ts"], //编译除了 02.ts文件
"files": ["*.ts"],//编译 所有文件
"compilerOptions": {
"removeComments": true,//去掉注释在执行的时候 直接终端输入 tsc即可
"strict": true,//开启严格模式
"noImplicitAny": true,//允许注释类型 为any 的 可以不用特意声明 any
"rootDir": "./src",//入口文件路径
"outDir": "./build", //出口文件路径
"sourceMap": true, //编译后 文件 和源文件的映射方便排错
"noUnusedLocals": true,// 未使用的变量 不再进行打包
}
}
15. 联合类型 和 类型守护
interface AI {
a:string,
ai():any
}
interface BI {
b:string,
bi():any
}
//联合类型
interface AI {
a:string,
ai():string
}
interface BI {
b:string,
bi():string
}function jw(j:AI | BI){//联合类型
//类型守护 判断 属于哪个接口
let a = (j as AI).a;
console.log("a=>",a);
if(a){
let ai = (j as AI).ai;
console.log(ai());
}
let b = (j as BI).b;
console.log("b=>",b);
if(b){
let bi = (j as BI).bi;
console.log(bi());
}
}
jw({a:"aaa",ai(){return "调用了ai方法"}})
jw({b:"bbb",bi(){return "调用了bi方法"}})
16. 枚举类型
enum TYPE { //定义枚举类型默认从0开始 也可以像这样手动设置
A = 1,
B = 2,
C = 3,
}
//反查枚举属性
console.log("反查A=>", TYPE[1]);
function F(type: any) {
switch (type) {
case TYPE.A:
console.log("case_a");
break;
case TYPE.B:
console.log("case_b");
break;
case TYPE.C:
console.log("case_c");
break;
}
}
F(TYPE.B);
17. 泛型 它像一个参数一样 把一个类型做参数传递
//把类型做参数传递
//基本泛型 T代表泛型
function A(a: T, b: T) {
console.log(a, b);
}
A>("1", "2");
A(1, 2);
//定义多个泛型
function D(a: T, b: P) {
console.log(a, b);
}
D, number>("1", 1);
//数组泛型 T代表泛型
function B(a: Array) {
console.log(a);
}
B([1, 2]);
//类泛型
class AA {
constructor(private a: T) {}
say_a(): T {
return this.a;
}
}
let a = new AA>("AA传入的参数");
console.log(a.say_a());
//泛型继承约定里面必须有一些东西
interface J {
name: string;
}
function JC(jc: T) {
console.log(jc);
}
JC({ name: "1" });
// J 中 要求必须有一个 name属性
//泛型约束
function YS(jc: T) { //泛型只能 从类型 string 和 number中 选择
console.log(jc);
}
YS("ys参数");
18. 命名空间 用命名空间将代码包裹 防止代码全局污染 实现模块化 命名空间可以嵌套
//定义命名空间
namespace N {
class A {
constructor(public a: string) {
console.log(a);
}
}
class B {
constructor(public b: string) {
console.log(b);
}
}
class C {
constructor(public c: string) {
console.log(c);
}
}
//如果你想在外界使用 需要 export 暴露出去
export class Main {
constructor() {
new A("aaaa");
new B("bbbb");
new C("cccc");
}
}
}
let m = new N.Main();
技术参考 b站:【技术胖】TypeScript从入门到精通视频教程-2020年新版
TS官网:https://www.tslang.cn
【前端笔记|TypeScript基础】写博客这么长时间 发现博客除了可以整理 我们不经常用但是很重要的容易忘的知识点 ,更重要的是学习能力得到了很大的提升, 坚持了这么久 我依然觉得写博客从来不只是在做一两件事, 而是把你的综合能力提升到了一定的高度 ,个人认为这就是学习的最好的方式。
推荐阅读
- 前端|flex布局
- java|自己的开源项目被尤雨溪写进演讲稿是一种什么体验()
- ui|element-ui 远程搜索组件el-select在项目中代码实现
- web前端学习|18.Vue组件化编程
- 前端|直接学 Vue 3 吧 —— 对话 Vue.js 作者尤雨溪
- mysql|大数据处理与开发课程设计——纽约出租车大数据分析
- 练习题 - 计算器 - 3 - 算法优化
- SVG|学习SVG(二)坐标系统
- Vue|Vue学习