• 作者:老汪软件技巧
  • 发表时间:2024-09-04 11:04
  • 浏览量:

ts是什么

官方文档中文版:

ts是js类型的超集,它可以编译成纯js。提供了静态类型检查和面向对象编程特性。

ts可以在任何浏览器、任何计算机和任何操作系统上运行(tsc后),并且是开源的

ts上手ts全局安装

npm install -g typescript

ts的作用

当我们创建一个1.ts,代码如下,我们会发现编译器会报错,告诉我们类型错误,这就展示了ts的一个作用。类型限制,js本来是一个弱类型语言,而ts是js的超集,完全兼容js,并且我们可以将变量写成强类型。

let a = 1
a = '2'
console.log(a);

但是我们利用node 1.ts去运行这份代码,会发现一点问题都没有,就像我们执行js代码一样,如果想让这份代码像我们看见编译器上的效果一样,我们可以通过npx tsc 1.ts来执行这份代码,他便会执行出错。或者你也可以选择安装一个ts-node(不过,大家看到tsc会不会有困惑?事实上这就是在编译一份ts代码成js代码,这个就像我们曾经没有编辑器时,用黑框命令行javac,将代码编译成.class文件,以便后续能在虚拟机上运行)

(当然,我们也可以用tsc 同时编译多份代码。)

npm i -g ts-node

除此之外,ts还可以防手抖,(敲错某个字母)

由此,我们就能发现,ts能够以更严谨的视角去规范我们的代码,这在大型项目中显得尤为重要,这也让我们后期在使用上也会更加方便,例如我们封装了一个格式化日期的函数,使用者并不知道该传递一个字符串还是需要一个Date对象,有了强制类型以后就不再有这些困扰

注意:由于ts是强类型,并不存在隐式类型转换,例如 1 + true 会报错

ts类型推断

ts存在类型推断,即便我们没有声明时限定类型,只要开始赋值了,这个变量出生时长什么样,他就是什么类型

由此可以推知,事实上函数的返回值类型是什么,也不需要我们去写

ts配置文件

官方文档:/docs/handbo…

我们可以在ts文件中创建一个tsconfig.json文件做配置,具体有哪些配置项大家可以自行查阅官方文档

下面举个例子:

// ts中的配置
{
    "files": [
        "file1.ts",
        "file2.ts"
    ],
    "compilerOptions": {
        "outFile": "dist/app.js"
    }
}

ts的类型any类型,可以看见,这和js就没有区别了,它可以赋值成任意类型的值,如果我们不写any,没有赋值,那么就默认any类型。但是它可以污染其他变量,y本来是字符串类型,但是它会被any类型污染

// any
let x: any
x = 1
x = '1'
let y: string
y = x

unknown类型,可以赋值成任意类型的值,不可以污染其他类型,并且不能访问类型为unkonwn类型变量身上的属性、不能直接进行四则运算,需要进行收缩类型


// unknown
let x : unknown
x = true
x = 123
let y :string
y = x

let a:unknown = 1
a + 1 // 报错
// 收缩类型
if(typeof a === 'number'){
    a + 1
}

never类型,不存在值

function foo() :never {
    throw new Error('error')
}

default(js中本来就有的类型)

const a:boolean = true
const b:number = 123
const c:string = 'hello'
const d:symbol = Symbol('hello')
const e:bigint = 123456789n
const obj:object = {}
const foo:object = function(){}
const arr:object = []
const f: null = null
const g = undefined
const str:String = new String('hello')
const num:Number = new Number(123)
const bool:Boolean = new Boolean(true)
const obj1 = new Object()
let o: Object
o = true
o = 123 // new Number(123)
o = undefined // 报错
o = null // 报错

注意:当配置文件中允许any类型的存在( "noImplicitAny": true),那么g会被推断成any类型,没办法变成undefined

特殊的类型

复杂类型(数组、元组、函数、对象)例如数组类型,number类型的数组,联合类型,泛型写法

let arr2: number[] = [1, 2, 3]
let arr: (number | string)[] = [1, 2, 3]
let arr1:Array<number | string> = [1, 2, 3]
// 也可以设置只读
const arr:readonly number[] = [1,2]

如果用泛型的写法,就不能写readonly了,但是ts提供了另一种写法

let arr4:ReadonlyArray<number> = [1,2]
let arr4:Readonly<number[]> = [1,2]
// as 断言
const arr = [1,2] as cosnt
// 二维数组
let arr:number[][] = [[1,2],[3,4]]

元组,类型声明写在里面。元组允许你在数组中混合不同类型的数据,并且保持对每个位置的类型控制。

const arr1:number[] = [1]
const tuple1:[number, string] = [1, 'hello']
// 可选,可以没有
let a:[number, string?] = [1]
// 只读
let x:readonly [number,number] = [1,2]
type read = Readonly<[number,number]>
let x:read = [1,2]

symbol

let x:symbol = Symbol()
// 不可修改的  unique  事实上就是const
const x:unique symbol = Symbol()

函数

返回值确定类型,但是如果确定了void 则不能返回值

function foo() {
    return 1
}
function foo():void{
let a = 1
return a // 报错
}

function foo(f:Function) {
    
}
function bar() {
    
}
foo(bar)
// 可选参数 ?  默认参数
function foo(x:number = 1,y?:number):[number:number?] {
    return [x,y]
}
foo(1,2)
// 当然参数也可以设置成只读
function foo(arg : readonly number[]){
    arg.push(1) // 报错
}
foo([1])

函数重载

// 函数重载
function reverse(str:string):string 
function reverse(str:number[]):number[] 
function reverse(str:string | number[]):string | number[] {
    if (typeof str === 'string') {
        return str.split('').reverse().join('')
    }else{
        return str.slice().reverse()
    }
}

对象 object Object {}区别

const obj: { a: number, b: number } = { a: 1, b: 2 }
const obj1: { a: number, b?: number } = { a: 1 }
const obj2: object = {a:1}  // object 广义上的,除了原始类型外的类型
obj2.a = 10 // 报错 obj2身上不存在a属性
const u:Object = new URL('http://www.baidu.com') // 所有的类的实例

小结

看到这里,你应该能大致明白ts是什么,ts的用法,ts的作用,后续持续更新ts高阶用法。