• javascript/ES6/TypeScript/Juqery语言的相关笔记


    整日游离于C/C++/C#/TS/JS/pyton/SQL之间,还有一堆框架,整个人都快魔怔了! (学不动党表示人间不值得!)

    备查笔记,记录一些Web脚本相关的语法和特性,随缘更新法

    Q.typescript 使用类作为函数成员参数:

    使用typeof关键字:

    typeof

    例子:

    class Product
    {
         constructor(title:string)
         {
            this._title = title;   
         }
    
         private _title:string;
    }
     
    
     function generatefactory(myClass:typeof Product):Product
     {
       return new myClass('product A');
     }

     模板函数中传递类名并约束构造函数:

     function genrateFactory<T extends Product> (constructor:{ new(_title:string):Product,new():Product } )
     {
        const x = new constructor('sss')
     }

    Q.typescript *.d.ts和declare的使用:

      TS基础

      note:最近不怎么写前端了,记录一下备忘复查.,完全对typescript的module的概念不熟悉的,请预览: https://www.tslang.cn/docs/handbook/declaration-files/introduction.html

      declare 关键字是用于变量的定义.

      *.d.ts是typescript的声明文件.可以有多个.d.ts,ts会根据tsconfig.json的配置路径去解析

      *.d.ts主要规定声明的作用域范围和模块的导出

        声明分为:

        1.类型定义声明

        2.模块导出声明

     

    1.类型定义声明:

        因为ts是“强”类型语言(开发意义上),如果要使用未知变量需要先定义后使用.

        例如在全局index.html里引用了的jquery 库,需要先 

    declare const $:any;

      才可以在ts中使用.当然也可以在*.d.ts里全局声明,这样就不需要在每个*.ts的文件里声明了.

      2.模块导出声明(为第三方库添加编写*.d.ts):

         如果是第三方的es6类库且没有提供d.ts可能需要自己去编写(commandjs/umdjscommandjs/umdjs)

         如adm-zip库为例:

    declare module 'adm-zip'
    {
        export default class AdmZip
        {
            /**
             * 
             * @param zipPath 
             */
            constructor( zipPath:string );
        
            /**
             * 
             */
            public getEntries():Array<ZipEntry>;
        
            /**
             * 
             * @param zipEntry 
             * @param targetPath 
             * @param maintainEntryPath 
             * @param overwrite 
             * @param callback 
             */
            public extractEntryToAsync( zipEntry:ZipEntry, 
                                        targetPath:string, 
                                        maintainEntryPath:boolean, 
                                        overwrite:boolean, 
                                        callback:(err:any)=>void):any;
        }
    
        export class ZipEntry
        {
            public entryName:string;
            public isDirectory:boolean;
        }
    }
        

       3.重新扩展module 类的成员:

      其他用法1:重载扩展/代码补全/加强可读性...

    例如我在*.d.ts中定义了

    declare namespace Electron
    {
       interface IpcRenderer
       {
          /**
           * 
           * @param event 
           * @param isTray 
           */
          send(event:'emp_onA', isTray:boolean):void;
          /**
           * 
           * @param event 
           * @param str 
           */
          send(event:'emp_onB', str:string):void;
    
          /**
           * 
           * @param event 
           * @param listener 
           */
          send(event:'emp_onC', listener:(arg:string)=>void ):void;
       }
    }

    vs code 或web storm会进行相应的函数补全..(ts大法好)

     

    Q.Javascript(js)的Promise的使用例子:

      以XMLHttpRequest实现的ajax的Promise例子:

    /**
     * ajax网络请求
     */
    function Req(url, method, data)
    {
    
      /**
       * @param {成功时,调用}} resolve 
       * @param {失败时,调用} reject 
       */
      let inner = function (resolve, reject)
      {
        let req = new XMLHttpRequest();
        
        /* jwt 表头setse设置 */
        //req.setRequestHeader('Authorization', `Bearer token`);
    
        req.onload = ()=>
        {
          resolve( req.response);
        };
    
        req.onerror = ()=>
        {
          reject(req.error);
        };
    
        req.open(method, url, true);
        req.send(data);
      };
    
      let promise = new Promise(inner);
      return promise;
    }
    
    Req(`https://www.baidu.com/`, `get`)
    .then((data)=>
    {
      console.log('success : ', data);
    })
    .catch((error)=>
    {
      console.error('error : ', error);
    });

    Q.javascript

    (js)

    模版字符串新语法糖:

    跟C#的新字符串语法糖类似.

    let testobj = {str : 'hello world.'};
    let str = `$hi, ${testobj.str} `;
    console.log(str);

    Q.javascript(js)的三个点(...)运算符:

    1.spread运算:

      语法糖,可快速向数组添加数组:

      

    let arr = [{id :'a'},{id :'b'},{id :'c'}];  
    let arr1 = [{id :'d'},{id :'e'},{id :'f'}];
    /**
    * arr新的数据为:[{"id":"a"},{"id":"b"},{"id":"c"},{"id":"d"},{"id":"e"},{"id":"f"}];
    **/

    2.可变函数参数,rest运算:

      函数参数动态化:

      跟c++的(...)和C#的params object[]一样的东西.都是用于可变参数(C++还可以用于可变模板类型数):

    function test(...aaa){console.log(aaa);}
    test('a',12312,{id :1231});
    ///aaa的数据结构为:["a", 12312, {id:1231}]

    3.JavaScript的拷贝:

      深拷贝要么用JSON.stringify和JSON.parse,要么自己扩展clone函数遍历属性或Lodash

      现在可以用ES6的(...)语法,实现浅拷贝:

      Note:仅单程引用,对于类似与{id: {name : 1111}};id还是并没有拷贝..以下还是得写clone...或转json

    let t = {id: 1};
    let t1 = {...t};
    t.id = 10000;
    
    console.log('t:', t,'t1:' t1);
    /**
    * t = {id:10000};t1 = {id:1};   
    */

    Q.TypeScript的Jquery和JqueryUI:

    虽然有

    @types/Jquery

    @types/jqueryui

    这俩个包,但是有些使用直接引用脚本比较方便

    以Vue+TypeScript为例。

    在Vue-Cli脚手架下的

    首先,在Index.html 里添加

        <!-- jquery ui -->
        <link rel="stylesheet" href="./static/lib/JqueryUI/jquery-ui.min.css">
        <script src="./static/lib/JqueryUI/jquery-2.2.4.min.js"></script>
        <script src="./static/lib/JqueryUI/jquery-ui.min.js"></script>
        <!-- jquery ui -->

    然后,需要用到的Ts或gobal.d.ts文件里添加以下代码(其他全局对象同理如Moment.js):

    declare const $:any;

     现在,就可以在TS里使用$进行Dom操作了

  • 相关阅读:
    zabbix+grafana使用
    其它工具网址
    IntelliJ IDEA 进行多线程调试
    mac外接显示器 双屏同时滑动问题
    wacher和acl
    zookeeper介绍
    iterm2用法与技巧
    linux下ssh公钥验证的设置和远程登录
    不变模式
    单例模式创建的三种方式
  • 原文地址:https://www.cnblogs.com/linqing/p/8521000.html
Copyright © 2020-2023  润新知