学习typescript

为了学习Vue3,今天过了typescript文档,笔记如下
参考来自 http://ts.xcatliu.com/

 var numa: number = 2;
    var global_num = 12
    class Numbers {
      num_val = 13;
      static sval = 10;

      storeNum():void {
        var local_num =14 ;
      }
    }
    var obj = new Numbers();
    var j:any;
    var n:any = "a b c"
    for(j in n) {
      console.log(n[j])
    }
    var sites = string[];
    sites = ["1","2","3"]
    console.log(sites[1])
    let namesdd = new Map();

    namesdd.set('ggo', 1);
    namesdd.set('sdo', 2);
    namesdd.set('who', 3);

    //接口
    //接口中会定义属性和变量类型
    interface RunOptions {
      program: string;
      commandline:string[]|string|(()=>string)  //数组,字符串,方法
    }
    // 声明创建接口实例
    var options:RunOptions = {program:"test1",commandline:"Hello"}
    options = {programs: "progs",commandline:()=>{return "**Hello world**"}}

    //变量索引值可以是number或string
    interface namelist {
      [index: number]: string
    }
    var newList:namelist = ["Google","Runoob","Taobao"] //数组元素必须是string

    //接口的继承
    interface Person {
      age: number
    }
    interface Musician extends Person {    //Musician继承于Person
      name: string
    }
    var singer = <Musician> {};
    singer.age = 27;
    singer.name = Jo;
    console.log(singer.age)   //27


    //创建类
    class Car {
      //成员变量
      engine:string;
      //构造函数
      constructor(engine:string){
        this.engine = engine
      }
      //方法
      disp():void {
        console.log("发动机为:" + this.engine)
      }
    }
    //实例化类对象
    var obj = new Car("XXSY1");
    obj.disp() //  发动机为XXSY1

    //对象
    var sites  = {
      site1: "value1",
      site2: "value2",
    }
    //在sites中添加方法
    sites.sayHello = function(){
      return "Hello"
    }
    //对象也可以作为一个参数传递给函数
    var invokesites = function(obj: { site1:string, site2 :string }) {
      console.log("site1 :"+obj.site1)
      console.log("site2 :"+obj.site2)
    }
    invokesites(sites)

    //模块化
    //通过export导出,import导入
    export interface SomeInterface{}
    import someInterface = require("./SomeInterface")

    //ts声明文件
    /* 在 TypeScript 中,我们并不知道 $ 或 jQuery 是什么东西
       使用 declare 关键字来定义它的类型
     */
    declare var jQuery: (selector: string) => any;
function slice (a?: number, b?: number) {
    // ? 跟在参数名字的后面,表示可选的参数
    // 注意:可选参数只能在 必须参数的后面
    // 如果可选参数在必选参数的前面,会报错
    
  }
  slice()
  slice(1)
  slice(1,2)
}

全局引用和局部引用(es module)

//通过import和export声明的文件,函数和变量是局部的
//declare.d.ts
import * as fs from 'fs';
declare const func: (a: number, b: number) => number

// 通过关键字global可以强制声明全局
//index.ts
declare global{
const func: (a: number, b: number) => number}
}

in 类型守卫

type Square = { size: number }
type Rectangle = { width: number; height: number }
type Shape = Square | Rectangle
// in 用来去联合类型的值
function isSquare(shape: Shape): shape is Shape {
  return 'size' in shape;   //属性是字符串形式,固定写法
}

let obj = <Shape>{size: 12}

// 常量断言
const objectA = {name: 'jack'} as const

调用签名

type Add = { (a: number, b: number): number }
const add: Add = (a: number, b: number) => {
  return a + b
}

type Point = { new(x: number, y: number): { x: number; y: number } }

// 索引签名
const objectB = {name: 'sino', age: 12}
const call = objectB['name']

//keyof 取得对象的属性
function getValue<T extends Object, K extends keyof T>(o: T, key: K): T[K] {
  return o[key]
}

const a = getValue(objectB, 'age')

泛型

let lastInArray = <T, >(arr: Array<T>) => {
  return arr[arr.length - 1]
}
const line1 = lastInArray([1, 2, 3, 4])

函数重载

//字符串split, 数组slice, 都不改变原数据
function reverse(string: string): string
function reverse(Array: string[]): string[]
function reverse(stringOrArray: string | string[]) {
  if (typeof stringOrArray == 'string') {
    return stringOrArray.split('').reverse().join('')
  } else {
    return stringOrArray.slice().reverse()
  }
}

//声明一个对象类型
const userInfo = {
  name: 'yin',
  age: 27,
  address: {
    city: 'Suzhou',
  }
}
type UserInfo = typeof userInfo;
// 此时的 UserInfo 类型 如下:
// type UserInfo = {
//   name: string,
//   age: number,
//   address: {
//     city: string,
//   }
// }

//只读数组
let arr: readonly number[] = [1, 2, 3];

// ?:  y也可以是不传
function echo(x: number, y ?: number) {
}
//es内置对象
let b: Boolean = Boolean(1)
let e: Error = new Error('Error occured')
let d: Date = new Date()
let r: RegExp = /[a-z]/

//DOM BOM 内置对象
let body: HTMLElement = document.body
let allDiv: NodeList = document.querySelectorAll('div')
document.addEventListener('click', function (e: MouseEvent) {
  console.log(e)
})
//使用type创建类型别名
type Name = string;
type NameResolver = () => string;
type NameOrResolver = Name | NameResolver;

function getName(n: NameOrResolver): Name {
  if (typeof n === 'string') {
    console.log('n')
    return n;
  } else {
    console.log('n()')
    return n();
  }
}

let aa = () => {
  return 'ss'
}
let ww = 'sasd'
getName(ww)     // n
getName(aa)     //n()

//字符串变量类型约束
type EventNames = 'click' | 'scroll' | 'mousemove'

function handleEvent(ele: Element, event: EventNames) {
}

handleEvent(document.getElementById('hello'), 'scroll')


const member = {
  userName: 'thinking',
  blog: 'www.baidu.com',
  children: {
    username: 'me',
    blog: 'mine',
    address: 'Suzhou'
  }
}
/*ES6 中的解构赋值*/
const {userName, blog, children: {address}} = member

function sum(x: number, y: number): number {
  return x + y
}

// mySum的类型是number,=> 表示函数的定义
let mySum: (x: number, y: number) => number = function (x: number, y: number): number {
  return x + y
}

function buildName(firstName: string = 'Tom', lastName?: string) {
  if (lastName) {
    return firstName + '' + lastName
  } else {
    return firstName
  }
}

let tomcat = buildName('Tom')

function push(array: any[], ...items: any[]) {
  items.forEach(function (item) {
  })
}

//元祖: 不同类型
let tom: [string, number] = ['Tom', 26]

//枚举
enum Days {Sun, Mon, Tue}

console.log(Days["Sun"] === 0) // true

// 先通过class定义类,通过constructor定义构造函数
// 然后通过new生成实例的时候,自动调用构造函数

class Animal {
  name: string;

  constructor(name: string) {
    this.name = name
  }

  sayHi(): string {
    return `My name is ${this.name}`
  }
}

let a: Animal = new Animal('Jack')
console.log(a.sayHi())

//类实现 (implements)
interface Alarm {
  alert(): void
}

interface Light {
  lightOn(): void

  lightOff(): void
}

class Car implements Alarm, Light {
  alert() {
    console.log('car alert')
  }

  lightOn() {
    console.log('car lightOn')
  }

  lightOff() {
    console.log('car lightOff')
  }
}

// 接口继承接口
interface Alarm {
  alert(): void;
}

interface LightableAlarm extends Alarm {
  lightOn(): void;

  lightOff(): void;
}

// 泛型:T
function createArray<T>(length: number, value: T): Array<T> {
  let result: T[] = []
  for (let i = 0; i < length; i++) {
    result[i] = value
  }
  return result
}

createArray<number>(3, 22)
createArray<string>(3, 'stringTEXT')

function swap<T, U>(tuple: [T, U]): [U, T] {
  return [tuple[1], tuple[0]]
}

swap([7, 'seven'])

// 接口的形状必须符合个数和类型
interface Lengthwise {
  length: number;
}

// 约束了这个泛型 T 必须符合 Lengthwise的形状(包含length属性)
function loggingIdentity<T extends Lengthwise>(arg: T): T {
  console.log(arg.length)
  return arg;
}
let demo : Lengthwise = {
  length: 12
}
loggingIdentity(demo)
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值