Ara you OK?
我看你是思想出现了偏差
哇!你认出了错别单词!恭喜你获得一次向我支付宝充值助我重返欧洲的机会!
这个页面管关不掉了,你自己看着办吧

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操作了

posted @ 2018-03-07 10:42  林清  阅读(484)  评论(0编辑  收藏  举报