ts基础使用

ts基础使用

1.全局安装typescript
npm install -g typescript
2.TS基本使用

1.原始类型定义

// 原始类型定义
let isDone: boolean = false
let age: number = 11
let myName: string = 'logan'
let message: string = `hello, ${myName}`
let u: undefined = undefined
let n: null = null

// undefined 和 null 是所有类型的子类型可以赋值给所有的类型
let num0: number = undefined
let num1: number = null

// 无法确定要使用什么类型时使用 any,
let notSure: any = 4
notSure = 'maybe a string'
notSure = true
// 确定是什么类型后any少用, 丧失了typescript类型检查的作用,可能会产生错误
// notSure.myName
// notSure.getMyName()

2.数组定义

// 数组不可以储存不同类型的值
let arrOfString0: Array<string> = ["a", "b", "c"] 
let arrOfString1: string[] = ["a", "b", "c"]
let arrOfNumbers: number[] = [1, 1, 1, 1]

// 数组的项中不允许出现其他的类型
// 报错 1 非字符串
let arrOfString2: string[] = ["a","b","c",1] 

3.元组定义

// 元组可以储存不同类型的值
// 定义时保证顺序一致, 数量一致就不会报错
let user: [string, number] = ['logan', 123]
console.log(user[0])  // logan

3.接口定义

// 接口:描述数组的形状
interface Person {
  readonly id: number;  // readonly只读属性,不可改变
  name: string;
  age: number;
  phone?: number  // ?可选属性 可有可无
}
let logan: Person = {
  id: 1,
  name: 'logan',
  age: 21
}
// logan.id = 2

4.枚举定义

enum Direction0 {
  // A,   // 默认为0
  A = 10, // 下面自动累加
  B,      // 11
  C,      // 12
  D       // 13
}
console.log(Direction0[0]) // A
console.log(Direction0.A)  // 10

// 常量基础使用
const enum Direction1 { // 使用const增加性能
  Up = 'Up',
  Down = 'Down',
  Left = 'Left',
  Right = 'Right'
}
const value = 'Up'
if (value === Direction1.Up) {
  console.log('go Up!')
}

5.类型推论

// 在没有明确写入变量类型时,ts会为我们自动写入第一次赋值的类型
let str = 'str'
// let str: string = 'str'

6.联合类型

// any可以赋值所有类型,所以可能会产生错误,我们可以使用联合类型来缩小范围,避免犯错
let numberOrString: number | string
numberOrString = 'abc'
numberOrString = 123

7.类型断言

// 使用联合类型后只能使用定义类型的共有属性,私有属性无法使用,
// 我们可以使用类型断言告诉浏览器,我知道他是什么类型, 就可以使用这个类型的私有属性
function getLength0 (input: number | string): number {
  const str = input as string
  if (str.length) {
    return str.length
  } else {
    const num = input as number
    return num.toString().length
  }
}
// 上面的方法可以简写,只要if判断类型后会自动为我们进行转换
function getLength1 (input: number | string): number {
  if (typeof input === 'string') {
    return input.length
  } else {
    return input.toString().length
  }
}

9.类型别名

// 取一个名字多处使用
// 示例一
let sum: (x: number, y: number) => number
const result1 = sum(1, 2)

type PlusType = (x: number, y: number) => number
let sum2: PlusType
const result2 = sum2(2, 3)

// 示例二
type StrOrNumber = string | number
let result3: StrOrNumber = '123'
result3 = 123
// result3 = true

10.字面量

const str: 'name' = 'name'
const num: 1 = 1
type Dircetions = 'Up' | 'Down' | 'left' | 'Right'
let toWhere: Dircetions = 'Down' // 只能选择上面四个之一

11.交叉类型

// 用来追加规范
interface IName {
  name: string
}
type IPerson = IName & { age: number }
let person: IPerson = { name: '123', age: 123 }

12.function方法使用

// 输入输出类型
function add0 (x: number, y: number, z?: number): number {
  if (typeof z === 'number') {
    return x + y + z
  } else {
    return x + y
  }
}
let result0 = add0(1, 1)

// 输入输出es6写法
const add1 = (x: number, y: number, z?: number): number => {
  if (typeof z === 'number') {
    return x + y + z
  } else {
    return x + y
  }
}
let result1 = add1(1, 1)

// 无输出类型 void
const add2 = (x: number, y: number, z?: number): void => {
  console.log("我是没有返回值的函数" + "x")
}

// 无输入类型
const add2 = (): string => {
  return "logan"
}

// 接口描述函数
// let add2: (x: number, y: number, z?: number) => number = add1
interface ISum {
  (x: number, y: number, z?: number): number
}
let add2: ISum = add1

13.泛型

// 定义函数、接口、类的时候,我们不预先指定类型,而是在使用的时候再指定类型的一种特征
// 可以把他看成一个占位符,在使用的时候动态的传入类型值

// 示例一
function echo <T> (age: T): T {
  return age
}
const result0 = echo('123')
console.log(result0.length)

// 示例二
function swap <T, U> (tuple: [T, U]): [U, T] {
  return [tuple[1], tuple[0]]
}
const result4 = swap(['logan', true])

// 二、泛型约束
// 当我们想在泛型方法里使用属性时,编辑器不确定我们要传入哪种类型的值,就会报错
// 我们可以使用接口进行约束,当传入的值不符合方法里的属性时,就会报错
interface IWithLength {
  length: number
}
function echoWithArr <T extends IWithLength> (age: T): T {
  console.log(age.length)
  return age
}
const str0 = echoWithArr('123')
const obj = echoWithArr({ length: 10 })
const arr = echoWithArr([1,2,3])
// const num = echoWithArr(123)

// 三、泛型在类、接口上的使用
class Queue <T> {
  private data = []
  push (item: T) {
    return this.data.push(item)
  }
  pop (): T {
    return this.data.shift()
  }
}
const queue = new Queue <number> ()
queue.push(1)
// queue.push('str')
console.log(queue.pop().toFixed())

interface KeyPair <T, U> {
  key: T,
  value: U
}
let kp0: KeyPair <number, string> = { key: 1, value: 'string' }
let kp1: KeyPair <string, number> = { key: 'string', value: 1 }
let arr0: number[] = [1, 2, 3]
let arr1: Array <number> =  [1, 2, 3]

14.引入第三方库

1.现在非常多的第三方库依然是用JavaScript进行编写,但是大多数情况下,库的所有者已经帮你写好了TypeScript声明文件,即x.d.ts文件。
2.还有一些情况是库中并没有附带ts声明文件,但是可以通过:npm i @types/xxx -s   # xxx为第三方JavaScript库的名字,下载该类型的库的声明文件。
3.以上两种方法都是用在别人已经帮你编写了声明文件的情况下,若无效只能自己创建声明文件
	比如要使用qqmap这个js库,直接在src文件夹的任意地方创建一个qqmap.d.ts文件(不过还是推荐放到@types文件夹中)。
	然后在qqmap.d.ts文件中编写声明:
	declare module "qqmap";
	直接ts文件中使用
	import qqmap from "qqmap";
	就可以引入这个第三方JavaScript库。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
TSTypeScript)是一种静态类型检查的高级编程语言,它是JavaScript的超集。在TS中,基础类型和泛型都是其重要的概念。 基础类型指的是TS中预定义的简单数据类型,例如:number、string、boolean、null、undefined等。基础类型用于表示变量或函数的数据类型,可以直接赋值给变量,也可以用作函数的参数和返回值类型。基础类型的定义和使用非常简单,只需要在变量或函数的类型声明中指定即可。 泛型(Generic)是一种在编程中广泛使用的概念,它允许我们在定义函数、类或接口时使用可变的类型。使用泛型可以提高代码的复用性和灵活性。在TS中,使用<>符号来声明使用泛型,并通过类型参数来指定具体的类型。 例如,定义一个泛型函数: function identity<T>(arg: T): T { return arg; } 这个函数使用了泛型类型参数T,可以接受不同类型的实参,并返回相同类型的值。通过使用泛型,我们可以传入任意类型的参数,而不需要重写多个函数。 另外,在TS中还可以使用泛型约束来限制泛型类型的操作。通过在泛型类型参数后面添加extends关键字和约束类型,可以确保传入的类型必须满足特定条件。 总结起来,TS中的基础类型和泛型都是为了增强代码的可读性、可维护性和可靠性而设计的。基础类型用于定义简单的数据类型,而泛型则用于创建更灵活和可复用的函数、类和接口。在实际开发中,合理使用基础类型和泛型,可以提高代码的质量和开发效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值