蜗牛与蝉 發表於 2019-8-11 14:43:00

TypeScript知识点

<h2 id="articleHeader1">1.1 Typescript 介绍</h2>
<p>1.TypeScript 是由微软开发的一款开源的编程语言,像后端 java、C#这样的面向对象语言可以让 js 开发大型企业项目。</p>
<p>2.TypeScript 是 Javascript的超级,遵循最新的 ES6、Es5 规范(相当于包含了es6、es5的语法)。TypeScript扩展了JavaScript的语法。</p>
<p>3.最新的 Vue 、React 也可以集成 TypeScript。</p>
<h2 id="articleHeader2">1.2 Typescript 安装 编译</h2>
<blockquote>安装nodejs环境,用npm全局安装typescript</blockquote>
<pre class="hljs sql"><code>npm <span class="hljs-keyword">install -g typescript
</span></code></pre>
<blockquote>Typescript文件后缀名为.ts,最后将编译成js文件
<p>Typescript手动编译 =&gt; tsc + 文件名</p>
</blockquote>
<pre class="hljs fortran"><code>// 将<span class="hljs-built_in">index.ts编译成<span class="hljs-built_in">index.js
tsc <span class="hljs-built_in">index.ts
</span></span></span></code></pre>
<h2 id="articleHeader3">1.3 Typescript开发工具Vscode自动编译.ts 文件</h2>
<p>1.3.1 tsc --init 生成配置文件tsconfig.json</p>
<p><span class="img-wrap"><img src="https://segmentfault.com/img/bVbghT0?w=619&amp;h=634"></span></p>
<p>1.3.2 点击菜单栏任务-运行任务(遇到错误使用快捷键ctrl + shift + b),点击 tsc:监视-tsconfig.json 然后就可以自动生成代码<br>了</p>
<p><span class="img-wrap"><img src="https://segmentfault.com/img/bVbghTL?w=1163&amp;h=510"></span></p>
<h1 id="articleHeader4">二、Typescript数据类型</h1>
<p>typescript中为了使编写的代码更规范,更有利于维护,增加了类型校验</p>
<h2 id="articleHeader5">2.1 基础类型</h2>
<p>在typescript中主要给我们提供了以下数据类型:</p>
<blockquote>布尔类型(boolean)&nbsp;<br>数字类型(number)&nbsp;<br>字符串类型(string)&nbsp;<br>数组类型(array)&nbsp;<br>元组类型(tuple)&nbsp;<br>枚举类型(enum)&nbsp;<br>任意类型(any)&nbsp;<br>null和undefined&nbsp;<br>void类型&nbsp;<br>never类型</blockquote>
<p>相比于js,typescript中多了枚举类型、任意类型、void类型和never类型</p>
<h2 id="articleHeader6">2.2 变量定义</h2>
<p>写ts代码变量必须指定类型,指定类型后赋值必须为指定的类型,否则报错</p>
<pre class="javascript hljs"><code class="js"><span class="hljs-keyword">var flag:boolean = <span class="hljs-literal">true
flag = <span class="hljs-number">123 <span class="hljs-comment">// 错误,类型不一致</span></span></span></span></code></pre>
<h2 id="articleHeader7">2.3 数据类型</h2>
<h4>布尔类型(boolean)</h4>
<pre class="javascript hljs"><code class="js"><span class="hljs-keyword">var flag:boolean = <span class="hljs-literal">true

flag = <span class="hljs-literal">false <span class="hljs-comment">// 正确

<span class="hljs-comment">// flag=123;// 错误</span></span></span></span></span></code></pre>
<h4>数字类型(number)</h4>
<pre class="javascript hljs"><code class="js"><span class="hljs-keyword">var num:number = <span class="hljs-number">123;

num = <span class="hljs-number">456; <span class="hljs-comment">// 正确

<span class="hljs-comment">// num='str';    //错误</span></span></span></span></span></code></pre>
<h4>字符串类型(string)</h4>
<pre class="javascript hljs"><code class="js"><span class="hljs-keyword">var str:string = <span class="hljs-string">'this is ts';

str=<span class="hljs-string">'haha';<span class="hljs-comment">//正确

<span class="hljs-comment">// str=true;//错误</span></span></span></span></span></code></pre>
<h4>数组类型(array) ts中定义数组有两种方式</h4>
<pre class="javascript hljs"><code class="js"><span class="hljs-comment">// 第一种
<span class="hljs-keyword">var arr:number[] = [<span class="hljs-number">1, <span class="hljs-number">2, <span class="hljs-number">3]

<span class="hljs-comment">// 第二种
<span class="hljs-keyword">var arr2:<span class="hljs-built_in">Array&lt;number&gt; = [<span class="hljs-number">1, <span class="hljs-number">2, <span class="hljs-number">3]</span></span></span></span></span></span></span></span></span></span></span></code></pre>
<h4>元组类型(tuple)元素的类型不必相同,写法和数组一样</h4>
<pre class="javascript hljs"><code class="js"><span class="hljs-keyword">let&nbsp;arr: = [<span class="hljs-number">123,<span class="hljs-string">'this is ts']</span></span></span></code></pre>
<h4>枚举类型(enum)</h4>
<p>用法:</p>
<pre class="hljs groovy"><code><span class="hljs-class"><span class="hljs-keyword">enum 枚举名{
    标识符[=整型常数],
    标识符[=整型常数],
    ...
    标识符[=整型常数],
}
</span></span></code></pre>
<pre class="javascript hljs"><code class="js">enum Flag {success = <span class="hljs-number">1,error = <span class="hljs-number">2};

<span class="hljs-keyword">let s:Flag = Flag.success <span class="hljs-comment">// 使用枚举类型中的值
<span class="hljs-built_in">console.log(<span class="hljs-string">'正确状态',s)
<span class="hljs-keyword">let f:Flag = Flag.error
<span class="hljs-built_in">console.log(<span class="hljs-string">'错误状态',f)</span></span></span></span></span></span></span></span></span></code></pre>
<h4>任意类型(any)</h4>
<p>为那些在编程阶段还不清楚类型的变量指定一个类型</p>
<pre class="javascript hljs"><code class="js"><span class="hljs-keyword">var number:any = <span class="hljs-number">123
number = <span class="hljs-string">'str'
number = <span class="hljs-literal">true</span></span></span></span></code></pre>
<h4>2.9 null 和 undefined</h4>
<p>undefined:</p>
<pre class="javascript hljs"><code class="js">{
    <span class="hljs-comment">// 在js中,变量已声明但未初始化为undefined
    <span class="hljs-keyword">var undefinedTest:number
    <span class="hljs-comment">// console.log(undefinedTest) // 错误写法,typescript报错,赋值了才正确

    <span class="hljs-comment">// 在typescript中,已声明未初始化的值要直接访问的话类型需要定义为undefined
    <span class="hljs-keyword">var undefinedTest2:<span class="hljs-literal">undefined
    <span class="hljs-built_in">console.log(undefinedTest2) <span class="hljs-comment">// 正确写法,输出undefined
}
{
    <span class="hljs-comment">// 可能是number类型 可能是undefined
    <span class="hljs-keyword">var undefinedTest3:number | <span class="hljs-literal">undefined;
    <span class="hljs-built_in">console.log(num);
}</span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p>null:</p>
<pre class="javascript hljs"><code class="js"><span class="hljs-comment">// null是一个空指针对象,undefined是未初始化的变量。因此,可以把undefined看作是空的变量,而null看作是空的对象
<span class="hljs-keyword">var nullTest:<span class="hljs-literal">null
nullTest = <span class="hljs-literal">null
<span class="hljs-comment">// nullTest = {} // 错误,定义了类型是null,值必须为null</span></span></span></span></span></code></pre>
<h4>void类型</h4>
<p>typescript中的void表示没有任何类型,一般用于定义方法的时候方法没有返回值。</p>
<pre class="javascript hljs"><code class="js"><span class="hljs-comment">// 表示方法没有返回任何类型
<span class="hljs-function"><span class="hljs-keyword">function <span class="hljs-title">run(<span class="hljs-params">): <span class="hljs-title">void {
    <span class="hljs-built_in">console.log(<span class="hljs-string">'run')
}

run()</span></span></span></span></span></span></span></span></code></pre>
<h4>never类型</h4>
<blockquote>表示的是那些永不存在的值的类型,例如异常</blockquote>
<pre class="javascript hljs"><code class="js"><span class="hljs-keyword">var a:never

<span class="hljs-comment">// a = 123 //错误写法
a = <span class="hljs-function">(<span class="hljs-params">() =&gt; {
    <span class="hljs-keyword">throw <span class="hljs-keyword">new <span class="hljs-built_in">Error(<span class="hljs-string">'错误');
})()</span></span></span></span></span></span></span></span></code></pre>
<h1 id="articleHeader8">三、Typescript函数</h1>
<p>内容概述: 函数的定义、可选参数、默认参数、剩余参数、函数重载、箭头函数。</p>
<h3 id="articleHeader9">3.1.1 函数的定义</h3>
<ul>
<li>es5定义函数有函数声明法和匿名函数法</li>
</ul>
<pre class="javascript hljs"><code class="js"><span class="hljs-comment">// 法一:函数声明法

<span class="hljs-function"><span class="hljs-keyword">function <span class="hljs-title">run(<span class="hljs-params">):<span class="hljs-title">string {
    <span class="hljs-keyword">return <span class="hljs-string">'run'
}

<span class="hljs-comment">/**
// 错误写法
function run():string {
    return 123
}
*/

<span class="hljs-comment">// 法二:匿名函数
<span class="hljs-keyword">var run2 = <span class="hljs-function"><span class="hljs-keyword">function (<span class="hljs-params">):<span class="hljs-title">string {
    <span class="hljs-keyword">return <span class="hljs-string">'run2'
}

<span class="hljs-built_in">console.log(<span class="hljs-string">'函数定义一', run())
<span class="hljs-built_in">console.log(<span class="hljs-string">'函数定义二', run2())</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<h3 id="articleHeader10">3.1.2 ts中定义方法传参</h3>
<ul>
<li>函数传参要指定数据类型</li>
</ul>
<pre class="javascript hljs"><code class="js"><span class="hljs-function"><span class="hljs-keyword">function <span class="hljs-title">paramFuc(<span class="hljs-params">name:string, age:number):<span class="hljs-title">string{
    <span class="hljs-keyword">return <span class="hljs-string">`<span class="hljs-subst">${name} --- <span class="hljs-subst">${age}`
}

<span class="hljs-built_in">console.log(<span class="hljs-string">'函数传参', paramFuc(<span class="hljs-string">'dz', <span class="hljs-number">20))</span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<h3 id="articleHeader11">3.1.3 函数没有返回值的方法用void</h3>
<pre class="javascript hljs"><code class="js"><span class="hljs-function"><span class="hljs-keyword">function <span class="hljs-title">voidFnc(<span class="hljs-params">):<span class="hljs-title">void{
    <span class="hljs-built_in">console.log(<span class="hljs-string">'没有返回值的方法用void')
}
voidFnc();</span></span></span></span></span></span></span></code></pre>
<h3 id="articleHeader12">3.2 可选参数</h3>
<ul>
<li>es5里面方法的实参和行参可以不一样,但是ts中必须一样,如果不一样就需要在可选参数后加?,这就是可选参数。</li>
</ul>
<pre class="javascript hljs"><code class="js"><span class="hljs-function"><span class="hljs-keyword">function <span class="hljs-title">electParam(<span class="hljs-params">name:string, age?:number):<span class="hljs-title">string {
    <span class="hljs-comment">// 这里的age可传可不传,age就是可选参数
    <span class="hljs-keyword">if(age){
      <span class="hljs-keyword">return <span class="hljs-string">`<span class="hljs-subst">${name} --- <span class="hljs-subst">${age}`
    }<span class="hljs-keyword">else{
      <span class="hljs-keyword">return <span class="hljs-string">`<span class="hljs-subst">${name} --- 年龄保密`
    }
}
<span class="hljs-built_in">console.log(<span class="hljs-string">'可选参数', electParam(<span class="hljs-string">'dz'))

<span class="hljs-comment">// 注意: 可选参数必须配置到参数的最后面

<span class="hljs-comment">// 错误写法:可选参数不在最后面
<span class="hljs-comment">// function electParam2(name?: string, age: number): string {
<span class="hljs-comment">//   ...
<span class="hljs-comment">// }</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<h3 id="articleHeader13">3.3 默认参数</h3>
<ul>
<li>es5里面没法设置默认参数,es6和ts中都可以设置默认参数</li>
</ul>
<pre class="javascript hljs"><code class="js"><span class="hljs-comment">// age为默认参数
<span class="hljs-function"><span class="hljs-keyword">function <span class="hljs-title">defaultParam(<span class="hljs-params">name:string, age:number = <span class="hljs-number">20):<span class="hljs-title">String {
    <span class="hljs-keyword">return <span class="hljs-string">`<span class="hljs-subst">${name} --- <span class="hljs-subst">${age}`
}

<span class="hljs-built_in">console.log(<span class="hljs-string">'默认参数', defaultParam(<span class="hljs-string">'dz'))</span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<h3 id="articleHeader14">3.4 剩余参数</h3>
<ul>
<li>当有很多参数时候或参数个数不确定,可以用三点运算符</li>
</ul>
<pre class="javascript hljs"><code class="js"><span class="hljs-comment">// sum参数传过来的是一个数组
<span class="hljs-function"><span class="hljs-keyword">function <span class="hljs-title">sum(<span class="hljs-params">...result: number[]): <span class="hljs-title">number {
    <span class="hljs-keyword">var sum = <span class="hljs-number">0;

    <span class="hljs-keyword">for (<span class="hljs-keyword">var i = <span class="hljs-number">0; i &lt; result.length; i++) {

      sum += result;
    }

    <span class="hljs-keyword">return sum;
}
<span class="hljs-built_in">console.log(<span class="hljs-string">'剩余参数', sum(<span class="hljs-number">1, <span class="hljs-number">2, <span class="hljs-number">3, <span class="hljs-number">4, <span class="hljs-number">5, <span class="hljs-number">6));

<span class="hljs-comment">// a=1 b=2 其他参数为剩余参数
<span class="hljs-function"><span class="hljs-keyword">function <span class="hljs-title">sum2(<span class="hljs-params">a: number, b: number, ...result: number[]): <span class="hljs-title">number {
    <span class="hljs-keyword">var sum = a * b;

    <span class="hljs-keyword">for (<span class="hljs-keyword">var i = <span class="hljs-number">0; i &lt; result.length; i++) {

      sum += result;
    }

    <span class="hljs-keyword">return sum;
}
<span class="hljs-built_in">console.log(<span class="hljs-string">'剩余参数2', sum2(<span class="hljs-number">1, <span class="hljs-number">2, <span class="hljs-number">3, <span class="hljs-number">4, <span class="hljs-number">5, <span class="hljs-number">6));</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<h3 id="articleHeader15">3.5 ts函数重载</h3>
<blockquote>同样的函数,传入不同的参数,实现不同的功能</blockquote>
<ul>
<li>java中方法的重载:重载指的是两个或者两个以上同名函数,但它们的参数不一样,这时会出现函数重载的情况。</li>
<li>typescript中的重载:通过为同一个函数提供多个函数类型定义来实现多种功能的目的。</li>
<li>ts为了兼容es5 以及 es6 重载的写法和java中有区别。</li>
</ul>
<pre class="javascript hljs"><code class="js"><span class="hljs-comment">//es5中同名函数,后面会覆盖前面的函数,ts中则不会 =&gt; 函数重载
<span class="hljs-function"><span class="hljs-keyword">function <span class="hljs-title">getInfo(<span class="hljs-params">name:string):<span class="hljs-title">string
<span class="hljs-title">function <span class="hljs-title">getInfo(<span class="hljs-params">name:string, age:number):<span class="hljs-title">string
<span class="hljs-title">function <span class="hljs-title">getInfo(<span class="hljs-params">name:any, age?:any):<span class="hljs-title">any {
    <span class="hljs-keyword">if(age) {
      <span class="hljs-keyword">return <span class="hljs-string">'姓名:' + name + <span class="hljs-string">'年龄:' + age
    }<span class="hljs-keyword">else{
      <span class="hljs-keyword">return <span class="hljs-string">'姓名:' + name
    }
}

<span class="hljs-built_in">console.log(getInfo(<span class="hljs-string">'dz'))
<span class="hljs-built_in">console.log(getInfo(<span class="hljs-string">'dz', <span class="hljs-number">20))
<span class="hljs-comment">// console.log(getInfo(20)) // 错误</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<h3 id="articleHeader16">3.6 箭头函数</h3>
<p>箭头函数和es6中一样</p>
<pre class="javascript hljs"><code class="js">setTimeout(<span class="hljs-function"><span class="hljs-params">() =&gt; {
    <span class="hljs-built_in">console.log(<span class="hljs-string">'箭头函数')
}, <span class="hljs-number">1000);</span></span></span></span></span></code></pre>
<h1 id="articleHeader17">四、Typescript中的类</h1>
<h2 id="articleHeader18">4.1 es5中的类</h2>
<p>内容概述:类的创建、静态方法、继承(对象冒充继承,原型链继承,对象冒充 + 原型链组合继承)</p>
<p>es5中的面向对象、构造函数、原型与原型链本质可以看这个文档http://caibaojian.com/javascr...&nbsp;, 个人觉得写得很清晰。</p>
<h3 id="articleHeader19">4.1.1 类的创建</h3>
<p>es5类在构造函数和原型链里都可以添加属性和方法,原型链上的属性会被多个实例所共享,而构造函数则不会。</p>
<pre class="javascript hljs"><code class="js">
<span class="hljs-function"><span class="hljs-keyword">function <span class="hljs-title">Person(<span class="hljs-params">) {
    <span class="hljs-keyword">this.name = <span class="hljs-string">'Ming'
    <span class="hljs-keyword">this.run = <span class="hljs-function"><span class="hljs-keyword">function(<span class="hljs-params">) {
      <span class="hljs-built_in">console.log(<span class="hljs-keyword">this.name + <span class="hljs-string">'在运动')
    }
}

Person.prototype.sex = <span class="hljs-string">'男' <span class="hljs-comment">// 原型链上的属性会被多个实例所共享
Person.prototype.work = <span class="hljs-function"><span class="hljs-keyword">function(<span class="hljs-params">) {
    <span class="hljs-built_in">console.log(<span class="hljs-keyword">this.name + <span class="hljs-string">'在工作')
}


<span class="hljs-keyword">var p = <span class="hljs-keyword">new Person()
p.run()
p.work()
<span class="hljs-built_in">console.log(p.name)
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<h3 id="articleHeader20">4.1.2 静态方法</h3>
<blockquote>调用静态方法不需要实例化</blockquote>
<pre class="javascript hljs"><code class="js">
Person.getInfo=<span class="hljs-function"><span class="hljs-keyword">function(<span class="hljs-params">){
    <span class="hljs-built_in">console.log(<span class="hljs-string">'我是静态方法');
}
Person.getInfo();
</span></span></span></span></span></code></pre>
<h3 id="articleHeader21">4.1.3 实现继承</h3>
<blockquote>对象冒充(或者叫构造函数继承)继承:可以继承构造函数里面的属性和方法,但是没法继承原型链上面的属性和方法
<p>原型继承:可以继承构造函数里面的属性和方法,也可以继承原型链上面的属性和方法,但是实例化子类的时候没法给父类传参</p>
</blockquote>
<p>下面是通过<strong>对象冒充 + 原型链</strong>组合继承,解决了上面两种继承方式存在的问题</p>
<pre class="javascript hljs"><code class="js">
<span class="hljs-function"><span class="hljs-keyword">function <span class="hljs-title">Worker(<span class="hljs-params">name,age){
    <span class="hljs-keyword">this.name=name;<span class="hljs-comment">/*属性*/
    <span class="hljs-keyword">this.age=age;
    <span class="hljs-keyword">this.run=<span class="hljs-function"><span class="hljs-keyword">function(<span class="hljs-params">){<span class="hljs-comment">/*实例方法*/
      alert(<span class="hljs-keyword">this.name+<span class="hljs-string">'在运动');
    }

}      
Worker.prototype.sex=<span class="hljs-string">"男";
Worker.prototype.work=<span class="hljs-function"><span class="hljs-keyword">function(<span class="hljs-params">){
    alert(<span class="hljs-keyword">this.name+<span class="hljs-string">'在工作');
}
   
<span class="hljs-function"><span class="hljs-keyword">function <span class="hljs-title">Web(<span class="hljs-params">name,age){
    Worker.call(<span class="hljs-keyword">this,name,age);<span class="hljs-comment">// 对象冒充继承,可以继承构造函数里面的属性和方法,实例化子类可以给父类传参
}
<span class="hljs-comment">// Web.prototype = new Worker();// 原型链继承方法一:继承Worker构造函数和原型上所有的方法和属性
Web.prototype = Worker.prototype;<span class="hljs-comment">//原型链继承方法二:优化了方法一重复继承构造函数属性和方法的问题(本质可以看看http://caibaojian.com/javascript-object-5.html)

<span class="hljs-keyword">var w = <span class="hljs-keyword">new Web(<span class="hljs-string">'赵四',<span class="hljs-number">20);   
w.run();
w.work();
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p>从上面可以看出,对象冒充继承是在子类Web构造函数里面通过call方法继承父类Worker的构造函数的属性和方法;原型链继承通过子类Web的原型对象等于父类Worker的原型对象来实现继承;最后这两种继承的组合方式实现了完美继承。</p>
<h2 id="articleHeader22">4.2 typescript中的类</h2>
<p>内容概述: ts中类的定义、继承、类修饰符、静态属性和静态方法、多态、抽象类和抽象方法</p>
<h3 id="articleHeader23">4.2.1 ts中类的定义</h3>
<p>ts中类的定义和es6类的定义一样</p>
<pre class="javascript hljs"><code class="js">
<span class="hljs-class"><span class="hljs-keyword">class <span class="hljs-title">PersonDefine {
    name: string <span class="hljs-comment">// 属性,前面省略了public关键词
    <span class="hljs-keyword">constructor(name:string) { <span class="hljs-comment">//构造函数
      <span class="hljs-keyword">this.name = name
    }
    run():string { <span class="hljs-comment">// 原型
      <span class="hljs-keyword">return <span class="hljs-string">`<span class="hljs-subst">${<span class="hljs-keyword">this.name}在运动`
    }
}
<span class="hljs-keyword">var define = <span class="hljs-keyword">new PersonDefine(<span class="hljs-string">'类的定义')
alert(define.run())
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<h3 id="articleHeader24">4.2.2 继承</h3>
<blockquote>ts中继承比es5简单很多,用extends super实现继承</blockquote>
<pre class="javascript hljs"><code class="js">
<span class="hljs-class"><span class="hljs-keyword">class <span class="hljs-title">WebExtend <span class="hljs-keyword">extends <span class="hljs-title">PersonDefine {
    <span class="hljs-keyword">constructor(name:string) {
      <span class="hljs-keyword">super(name) <span class="hljs-comment">// super继承父类的构造函数,并向父类构造函数传参
    }
    work():string {
      <span class="hljs-keyword">return <span class="hljs-string">`<span class="hljs-subst">${<span class="hljs-keyword">this.name}在工作`
    }
}

<span class="hljs-keyword">var extend = <span class="hljs-keyword">new WebExtend(<span class="hljs-string">'继承')
alert(extend.run())
alert(extend.work())
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<h3 id="articleHeader25">4.2.3 ts类里面的修饰符</h3>
<p>修饰符:typescript里面定义属性的时候给我们提供了三种修饰符</p>
<ul>
<li>public: 公有修饰符,在当前类里面、子类、类外面都可以访问</li>
<li>protected:保护类型,在当前类里面、子类里面可以访问,在类外部没法访问</li>
<li>private :私有修饰符,在当前类里面可以访问,子类、类外部都没法访问</li>
</ul>
<p>注意:属性如果不加修饰符,默认就是公有修饰符</p>
<pre class="javascript hljs"><code class="js">
<span class="hljs-comment">// 以private为例
<span class="hljs-class"><span class="hljs-keyword">class <span class="hljs-title">PersonPrivate{
    private name:string;<span class="hljs-comment">/*被private修饰的属性 =&gt; 私有属性*/
    <span class="hljs-keyword">constructor(name:string){
      <span class="hljs-keyword">this.name=name;
    }
    run():string{
      <span class="hljs-keyword">return <span class="hljs-string">`<span class="hljs-subst">${<span class="hljs-keyword">this.name}在运动` <span class="hljs-comment">// 私有属性只能在当前类里面可以访问
    }
}

<span class="hljs-class"><span class="hljs-keyword">class <span class="hljs-title">Web <span class="hljs-keyword">extends <span class="hljs-title">PersonPrivate{
    <span class="hljs-keyword">constructor(name:string){
      <span class="hljs-keyword">super(name)
    }
    work(){
      <span class="hljs-comment">// return `${this.name}在工作` // 报错,子类不能访问父类的私有属性
    }
}

<span class="hljs-keyword">var privateName = <span class="hljs-keyword">new PersonPrivate(<span class="hljs-string">'private')
alert(privateName.run())
<span class="hljs-comment">// console.log(privateName.name) // 报错,外部不能访问类的私有属性
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<h3 id="articleHeader26">4.2.4 静态属性和静态方法</h3>
<blockquote>为什么要用静态属性和静态方法?jq里面的$.ajax就是用的静态方法</blockquote>
<pre class="javascript hljs"><code class="js">
<span class="hljs-function"><span class="hljs-keyword">function <span class="hljs-title">$(<span class="hljs-params">element) {
    <span class="hljs-keyword">return <span class="hljs-keyword">new Base(element)
}

<span class="hljs-function"><span class="hljs-keyword">function <span class="hljs-title">Base(<span class="hljs-params">element) {
    <span class="hljs-keyword">this.element = <span class="hljs-built_in">document.getElementById(element)
    <span class="hljs-keyword">this.css = <span class="hljs-function"><span class="hljs-keyword">function(<span class="hljs-params">arr, value) {
      <span class="hljs-keyword">this.element.style = value
    }
}
$(<span class="hljs-string">'box').css(<span class="hljs-string">'color',<span class="hljs-string">'red')
$.ajax = <span class="hljs-function"><span class="hljs-keyword">function(<span class="hljs-params">) {}<span class="hljs-comment">// 想要在$上使用方法怎么办,用静态方法
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<blockquote>ts中实现静态属性和静态方法用static</blockquote>
<pre class="javascript hljs"><code class="js">
<span class="hljs-class"><span class="hljs-keyword">class <span class="hljs-title">PersonStatic{
    <span class="hljs-comment">/*公有属性*/
    public name:string;
    <span class="hljs-keyword">constructor(name:string) {
      <span class="hljs-keyword">this.name=name;
    }
    <span class="hljs-comment">/*实例方法(需要被实例化,所以为实例方法)*/
    run(){
      <span class="hljs-keyword">return <span class="hljs-string">`<span class="hljs-subst">${<span class="hljs-keyword">this.name}在运动`
    }
    <span class="hljs-comment">/*静态属性*/
    <span class="hljs-keyword">static sex = <span class="hljs-string">'男'
    <span class="hljs-comment">/*静态方法,里面没法直接调用类里面的属性*/
    <span class="hljs-keyword">static info(){
      <span class="hljs-comment">// return 'info方法' + this.name// 静态方法不能调用本类的方法和属性,可以调用静态属性
      <span class="hljs-keyword">return <span class="hljs-string">'info方法' + PersonStatic.sex
    }
}

<span class="hljs-built_in">console.log(<span class="hljs-string">'静态方法' + PersonStatic.info())
<span class="hljs-built_in">console.log(<span class="hljs-string">'静态属性' + PersonStatic.sex)
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<h3 id="articleHeader27">4.2.5 多态</h3>
<blockquote>父类定义一个方法不去实现,让继承它的子类去实现,每一个子类的该方法有不同的表现</blockquote>
<ul>
<li>多态属于继承</li>
</ul>
<p>比如定义一个父类Animal,里面的eat方法不去实现,让子类Dog和Cat分别实现自己的eat方法</p>
<pre class="javascript hljs"><code class="js">
<span class="hljs-class"><span class="hljs-keyword">class <span class="hljs-title">Animal {
    name:string;
    <span class="hljs-keyword">constructor(name:string) {
      <span class="hljs-keyword">this.name=name;
    }
    eat(){   <span class="hljs-comment">// eat方法继承它的子类去实现
    }
}
<span class="hljs-class"><span class="hljs-keyword">class <span class="hljs-title">Dog <span class="hljs-keyword">extends <span class="hljs-title">Animal{
    <span class="hljs-keyword">constructor(name:string){
      <span class="hljs-keyword">super(name)
    }
    eat(){
      <span class="hljs-keyword">return <span class="hljs-keyword">this.name+<span class="hljs-string">'吃粮食'
    }
}

<span class="hljs-class"><span class="hljs-keyword">class <span class="hljs-title">Cat <span class="hljs-keyword">extends <span class="hljs-title">Animal{
    <span class="hljs-keyword">constructor(name:string){
      <span class="hljs-keyword">super(name)
    }
    eat(){
      <span class="hljs-keyword">return <span class="hljs-keyword">this.name+<span class="hljs-string">'吃老鼠'
    }
}
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<h3 id="articleHeader28">4.2.6 抽象类和抽象方法</h3>
<blockquote>定义:用abstract关键字定义抽象类和抽象方法,抽象类中的抽象方法不包含具体实现并且必须在派生类(抽象类的子类)中实现</blockquote>
<ul>
<li>抽象类:它是提供其他类继承的基类,不能直接被实例化,子类继承可以被实例化</li>
<li>abstract修饰的方法(抽象方法)只能放在抽象类里面</li>
<li>抽象类和抽象方法用来定义标准(比如定义标准为:抽象类Animal有抽象方法eat,要求它的子类必须包含eat方法)</li>
</ul>
<pre class="javascript hljs"><code class="js">
abstract <span class="hljs-class"><span class="hljs-keyword">class <span class="hljs-title">AnimalAbst{
    public name:string;
    <span class="hljs-keyword">constructor(name:string){
      <span class="hljs-keyword">this.name=name;
    }
    abstract eat():any;<span class="hljs-comment">//抽象方法不包含具体实现并且必须在派生类中实现
    run(){
      <span class="hljs-built_in">console.log(<span class="hljs-string">'其他方法可以不实现')
    }
}
<span class="hljs-comment">// var a = new Animal() /*错误的写法,抽象类不能被实例化*/

<span class="hljs-class"><span class="hljs-keyword">class <span class="hljs-title">DogAbst <span class="hljs-keyword">extends <span class="hljs-title">Animal{
    <span class="hljs-comment">//抽象类的子类必须实现抽象类里面的抽象方法
    <span class="hljs-keyword">constructor(name:any){
      <span class="hljs-keyword">super(name)
    }
    eat(){
      <span class="hljs-keyword">return <span class="hljs-keyword">this.name + <span class="hljs-string">'吃粮食'
    }
}

<span class="hljs-keyword">var d = <span class="hljs-keyword">new DogAbst(<span class="hljs-string">'小花花');
<span class="hljs-built_in">console.log(<span class="hljs-string">'抽象类和抽象方法',d.eat());
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<h1 id="articleHeader29">五、TypesSript接口</h1>
<p><strong>接口定义</strong>:接口是对传入参数进行约束;或者对类里面的属性和方法进行声明和约束,实现这个接口的类必须实现该接口里面属性和方法;typescript中的接口用interface关键字定义。</p>
<p>接口作用:接口定义了某一批类所需要遵守的规范,接口不关心这些类的内部状态数据,也不关心这些类里方法的实现细节,它只规定这批类里必须提供某些方法,提供这些方法的类就可以满足实际需要。typescrip中的接口类似于java,同时还增加了更灵活的接口类型,包括属性、函数、可索引和类等。</p>
<p>内容概述:接口分类:(属性接口、函数类型接口、可索引接口、类类型接口),接口的继承</p>
<h3 id="articleHeader30">5.1 接口分类</h3>
<h3 id="articleHeader31">5.1.1 属性接口</h3>
<blockquote>对传入对象的约束(也就是对json的约束)</blockquote>
<p>在了解接口之前,我们来看看函数传入obj参数</p>
<pre class="javascript hljs"><code class="js">
<span class="hljs-function"><span class="hljs-keyword">function <span class="hljs-title">printLabel(<span class="hljs-params">labelInfo: {label:string}){
    <span class="hljs-keyword">return labelInfo
}
<span class="hljs-comment">// printLabel({name:'obj'});//错误的写法
<span class="hljs-built_in">console.log(printLabel({<span class="hljs-attr">label: <span class="hljs-string">'obj'}))
</span></span></span></span></span></span></span></span></span></code></pre>
<p>和上面类似,由此引入属性接口 =&gt; 对方法传入参数进行约束</p>
<p>下面为属性接口的例子,方法printFullName对传入参数FullName(为对象)进行约束</p>
<pre class="javascript hljs"><code class="js">
interface FullName{
    <span class="hljs-attr">firstName: string; <span class="hljs-comment">// 注意;结束
    secondName: string;
    age?: number <span class="hljs-comment">// 接口的可选属性用?
}

<span class="hljs-function"><span class="hljs-keyword">function <span class="hljs-title">printFullName(<span class="hljs-params">name:FullName) {
    <span class="hljs-comment">// 传入对象必须包含firstName和secondName,可传可不传age
    <span class="hljs-keyword">return name
}
<span class="hljs-keyword">var obj = {
    <span class="hljs-attr">firstName:<span class="hljs-string">'小',
    <span class="hljs-attr">secondName:<span class="hljs-string">'明',
    <span class="hljs-attr">age: <span class="hljs-number">20
}
<span class="hljs-built_in">console.log(printFullName(obj))
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p><strong>属性接口应用:原生js封装ajax</strong></p>
<pre class="javascript hljs"><code class="js">
interface Config{
    <span class="hljs-attr">type: string;
    url: string;
    data?: string;
    dataType: string;
}
<span class="hljs-function"><span class="hljs-keyword">function <span class="hljs-title">ajax(<span class="hljs-params">config: Config) {
    <span class="hljs-keyword">var xhr = <span class="hljs-keyword">new XMLHttpRequest
    xhr.open(config.type, config.url, <span class="hljs-literal">true)
    xhr.send(config.data)
    xhr.onreadystatechange = <span class="hljs-function"><span class="hljs-keyword">function(<span class="hljs-params">) {
      <span class="hljs-keyword">if(xhr.readyState == <span class="hljs-number">4 &amp;&amp; xhr.status == <span class="hljs-number">200) {
            <span class="hljs-keyword">if(config.dataType == <span class="hljs-string">'json'){
                <span class="hljs-built_in">console.log(<span class="hljs-built_in">JSON.parse(xhr.responseText))
            }<span class="hljs-keyword">else{
                <span class="hljs-built_in">console.log(xhr.responseText)
            }
      }
    }
}

ajax({
    <span class="hljs-attr">type: <span class="hljs-string">'get',
    <span class="hljs-attr">data: <span class="hljs-string">'name=xiaoming',
    <span class="hljs-attr">url: <span class="hljs-string">'http://a.itying.com/api/productlist',
    <span class="hljs-attr">dataType: <span class="hljs-string">'json'
})
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<h3 id="articleHeader32">5.1.2 函数类型接口</h3>
<blockquote>对方法传入的参数以及返回值进行约束</blockquote>
<pre class="javascript hljs"><code class="js">
interface encrypt{
    (key: string, <span class="hljs-attr">value: string): string; <span class="hljs-comment">// 传入的参数和返回值的类型
}

<span class="hljs-keyword">var md5:encrypt = <span class="hljs-function"><span class="hljs-keyword">function(<span class="hljs-params">key:string, value:string):<span class="hljs-title">string{
    <span class="hljs-comment">// encrypt对加密方法md5进行约束,同时md5方法的参数和返回值类型和encrypt要保持一致
    <span class="hljs-keyword">return key + value
}

<span class="hljs-built_in">console.log(md5(<span class="hljs-string">'name', <span class="hljs-string">'小明'))
</span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<h3 id="articleHeader33">5.1.3 可索引接口</h3>
<blockquote>对索引和传入参数的约束(一般用于对数组、对象的约束)</blockquote>
<p>ts中定义数组:</p>
<pre class="javascript hljs"><code class="js">
<span class="hljs-keyword">var arr1:number[] = [<span class="hljs-number">1,<span class="hljs-number">2]
<span class="hljs-keyword">var arr2:<span class="hljs-built_in">Array&lt;string&gt; = [<span class="hljs-string">'1', <span class="hljs-string">'2']
</span></span></span></span></span></span></span></code></pre>
<p>现在用接口来实现:</p>
<pre class="javascript hljs"><code class="js">
<span class="hljs-comment">// 对数组的的约束
interface UserArr{
    <span class="hljs-comment">// 索引为number,参数为string
    : string
}
<span class="hljs-keyword">var userarr:UserArr = [<span class="hljs-string">'a', <span class="hljs-string">'b']
<span class="hljs-built_in">console.log(userarr)
</span></span></span></span></span></span></code></pre>
<pre class="javascript hljs"><code class="js">
<span class="hljs-comment">// 对象的约束
interface UserObj{
    <span class="hljs-comment">// 索引为string,参数为string
    : string
}
<span class="hljs-keyword">var userobj:UserObj = { <span class="hljs-attr">name: <span class="hljs-string">'小明', <span class="hljs-attr">sex: <span class="hljs-string">'男' }
<span class="hljs-built_in">console.log(userobj)
</span></span></span></span></span></span></span></span></code></pre>
<h3 id="articleHeader34">5.1.4 类类型接口</h3>
<blockquote>对类的约束,和抽象类抽象有点相似</blockquote>
<pre class="javascript hljs"><code class="js">
interface Animal{
    <span class="hljs-comment">// 对类里面的属性和方法进行约束
    name:string;
    eat(str:string):<span class="hljs-keyword">void;
}
<span class="hljs-comment">// 类实现接口要用implements关键字,必须实现接口里面声明的方法和属性
<span class="hljs-class"><span class="hljs-keyword">class <span class="hljs-title">Cat <span class="hljs-title">implements <span class="hljs-title">Animal{
    name:string;
    <span class="hljs-keyword">constructor(name:string){
      <span class="hljs-keyword">this.name = name
    }
    eat(food:string){
      <span class="hljs-built_in">console.log(<span class="hljs-keyword">this.name + <span class="hljs-string">'吃' + food)
    }
}
<span class="hljs-keyword">var cat = <span class="hljs-keyword">new Cat(<span class="hljs-string">'小花')
cat.eat(<span class="hljs-string">'老鼠')
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<h3 id="articleHeader35">5.2 接口的继承</h3>
<blockquote>和类的继承一样,用extends实现接口继承</blockquote>
<p>下面同时实现类的继承和接口的继承</p>
<pre class="javascript hljs"><code class="js">
interface Animal {
    eat(): <span class="hljs-keyword">void;
}
<span class="hljs-comment">// 继承Animal接口,则实现Person接口的类必须也实现Animal接口里面的方法
interface Person extends Animal {
    work(): <span class="hljs-keyword">void;
}

<span class="hljs-class"><span class="hljs-keyword">class <span class="hljs-title">Programmer {
    public name: string;
    <span class="hljs-keyword">constructor(name: string) {
      <span class="hljs-keyword">this.name = name;
    }
    coding(code: string) {
      <span class="hljs-built_in">console.log(<span class="hljs-keyword">this.name + code)
    }
}

<span class="hljs-comment">// 继承类并且实现接口
<span class="hljs-class"><span class="hljs-keyword">class <span class="hljs-title">Web <span class="hljs-keyword">extends <span class="hljs-title">Programmer <span class="hljs-title">implements <span class="hljs-title">Person {
    <span class="hljs-keyword">constructor(name: string) {
      <span class="hljs-keyword">super(name)
    }
    eat() {
      <span class="hljs-built_in">console.log(<span class="hljs-keyword">this.name + <span class="hljs-string">'吃')
    }
    work() {
      <span class="hljs-built_in">console.log(<span class="hljs-keyword">this.name + <span class="hljs-string">'工作');
    }
}

<span class="hljs-keyword">var w = <span class="hljs-keyword">new Web(<span class="hljs-string">'小李');
w.eat();
w.coding(<span class="hljs-string">'写ts代码');
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<h1 id="articleHeader36">六、TypesSript泛型</h1>
<p><strong>泛型定义</strong>:泛型定义:泛型就是解决类、接口、方法的复用性,以及对不特定数据类型的支持(类型校验)。ts中用T表示泛型。</p>
<blockquote>泛型公式: &lt;T&gt;表示泛型,调用的时候指定T的数据类型</blockquote>
<p>软件工程中,我们不仅要创建一致的定义良好的API,同时也要考虑可重用性。 组件不仅能够支持当前的数据类型,同时也能支持未来的数据类型,这在创建大型系统时为你提供了十分灵活的功能。</p>
<p>在像C#和Java这样的语言中,可以使用泛型来创建可重用的组件,一个组件可以支持多种类型的数据。 这样用户就可以以自己的数据类型来使用组件。</p>
<p>内容概述:内容概述:函数的泛型、类的泛型、泛型接口</p>
<h3 id="articleHeader37">6.1 函数的泛型</h3>
<blockquote>传入的参数类型和返回的参数类型可以指定</blockquote>
<p>我们来看看函数用ts数据类型,想要同时返回string类型和number类型</p>
<pre class="javascript hljs"><code class="js">
<span class="hljs-function"><span class="hljs-keyword">function <span class="hljs-title">getData1(<span class="hljs-params">value:string):<span class="hljs-title">string{
    <span class="hljs-keyword">return value;
}
<span class="hljs-function"><span class="hljs-keyword">function <span class="hljs-title">getData2(<span class="hljs-params">value:number):<span class="hljs-title">number{
    <span class="hljs-keyword">return value;
}
</span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p>这样要写不同的函数,不能按照需求返回不同类型数据,造成代码冗余 =&gt; 由此引入泛型</p>
<blockquote>&lt;T&gt;表示泛型,调用的时候指定T的数据类型</blockquote>
<pre class="javascript hljs"><code class="js">
<span class="hljs-function"><span class="hljs-keyword">function <span class="hljs-title">dataT&lt;<span class="hljs-title">T&gt;(<span class="hljs-params">value:T):<span class="hljs-title">T{
    <span class="hljs-comment">// 传入参数为T 返回值为T
    <span class="hljs-keyword">return value
}
dataT&lt;number&gt;(<span class="hljs-number">1) <span class="hljs-comment">// 调用指定泛型为number类型,则传入参数也必须为number类型
dataT&lt;string&gt;(<span class="hljs-string">'string')

<span class="hljs-function"><span class="hljs-keyword">function <span class="hljs-title">dataAny&lt;<span class="hljs-title">T&gt;(<span class="hljs-params">value:T):<span class="hljs-title">any{
    <span class="hljs-keyword">return <span class="hljs-string">'传入参数为T,任意类型返回值';
}
dataAny&lt;number&gt;(<span class="hljs-number">123); <span class="hljs-comment">// 参数必须是number
dataAny&lt;string&gt;(<span class="hljs-string">'这是一个泛型');
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<h3 id="articleHeader38">6.2 类的泛型</h3>
<blockquote>也是用&lt;T&gt;来实现类的泛型,new的时候指定T的数据类型</blockquote>
<p>有个最小堆算法,需要同时支持返回数字和字符串两种类型</p>
<p>使用泛型之前:只能在类的类部指定数据类型,实现需求还要写一套string类型的类</p>
<pre class="javascript hljs"><code class="js">
<span class="hljs-class"><span class="hljs-keyword">class <span class="hljs-title">MinClass{
    public list:number[]=[];
    add(num:number){
      <span class="hljs-keyword">this.list.push(num)
    }
    min():number{
      <span class="hljs-keyword">var minNum=<span class="hljs-keyword">this.list[<span class="hljs-number">0];
      <span class="hljs-keyword">for(<span class="hljs-keyword">var i=<span class="hljs-number">0;i&lt;<span class="hljs-keyword">this.list.length;i++){
            <span class="hljs-keyword">if(minNum&gt;<span class="hljs-keyword">this.list){
                minNum=<span class="hljs-keyword">this.list;
            }
      }
      <span class="hljs-keyword">return minNum;
    }
}

<span class="hljs-keyword">var m=<span class="hljs-keyword">new MinClass();
m.add(<span class="hljs-number">1);
m.add(<span class="hljs-number">2);
alert(m.min());
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<p>使用泛型之后:只用一套类来实现</p>
<pre class="javascript hljs"><code class="js">
<span class="hljs-class"><span class="hljs-keyword">class <span class="hljs-title">MinClassT&lt;<span class="hljs-title">T&gt;{
    public list:T[]=[];
    add(value:T):<span class="hljs-keyword">void{
      <span class="hljs-keyword">this.list.push(value);
    }
    min():T{      
      <span class="hljs-keyword">var minNum=<span class="hljs-keyword">this.list[<span class="hljs-number">0];
      <span class="hljs-keyword">for(<span class="hljs-keyword">var i=<span class="hljs-number">0;i&lt;<span class="hljs-keyword">this.list.length;i++){
            <span class="hljs-keyword">if(minNum&gt;<span class="hljs-keyword">this.list){
                minNum=<span class="hljs-keyword">this.list;
            }
      }
      <span class="hljs-keyword">return minNum;
    }
}
<span class="hljs-keyword">var m1=<span class="hljs-keyword">new MinClassT&lt;number&gt;();   <span class="hljs-comment">/*实例化类 并且指定了类的T代表的类型是number*/
m.add(<span class="hljs-number">1);
m.add(<span class="hljs-number">2);
alert(m1.min())

<span class="hljs-keyword">var m2=<span class="hljs-keyword">new MinClassT&lt;string&gt;();   <span class="hljs-comment">/*实例化类 并且指定了类的T代表的类型是string*/
m2.add(<span class="hljs-string">'c');
m2.add(<span class="hljs-string">'a');
alert(m2.min())
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<h3 id="articleHeader39">6.3 泛型接口</h3>
<p>有一个函数类型接口</p>
<pre class="javascript hljs"><code class="js">
interface ConfigFn{
    (value:string):string;
}
<span class="hljs-keyword">var setData:ConfigFn = <span class="hljs-function"><span class="hljs-keyword">function(<span class="hljs-params">value:string):<span class="hljs-title">string{
    <span class="hljs-keyword">return value
}
setData(<span class="hljs-string">'name');
<span class="hljs-comment">// setData(20); // 错误
</span></span></span></span></span></span></span></span></code></pre>
<p>setData(20);写法错误,想要传入number类型的参数又要写一个函数类型接口 =&gt; 用泛型接口</p>
<p>泛型接口有两种写法:</p>
<pre class="javascript hljs"><code class="js">
<span class="hljs-comment">// 泛型接口定义方式一
interface ConfigFnOne{
    &lt;T&gt;(value:T):T;
}
<span class="hljs-keyword">var setDataOne:ConfigFnOne = <span class="hljs-function"><span class="hljs-keyword">function&lt;<span class="hljs-title">T&gt;(<span class="hljs-params">value:T):<span class="hljs-title">T{
    <span class="hljs-keyword">return value
}
<span class="hljs-comment">// 既可以传入string也可以传入number类型参数
setDataOne&lt;string&gt;(<span class="hljs-string">'name');
setDataOne&lt;number&gt;(<span class="hljs-number">20);
</span></span></span></span></span></span></span></span></span></span></span></code></pre>
<pre class="javascript hljs"><code class="js">
<span class="hljs-comment">// 泛型接口定义方式二
interface ConfigFnTwo&lt;T&gt;{
    (value:T):T;
}
<span class="hljs-function"><span class="hljs-keyword">function <span class="hljs-title">setDataTwo&lt;<span class="hljs-title">T&gt;(<span class="hljs-params">value:T):<span class="hljs-title">T{
    <span class="hljs-keyword">return value
}
<span class="hljs-keyword">var setDataTwoFn:ConfigFnTwo&lt;string&gt; = setDataTwo
setDataTwoFn(<span class="hljs-string">'name');
</span></span></span></span></span></span></span></span></span></span></code></pre>
<p>示例代码请查看github,欢迎start&nbsp;https://github.com/dzfrontend...</p><br><br>
来源:https://www.cnblogs.com/zhuxinpeng-looking/p/11334986.html
頁: [1]
查看完整版本: TypeScript知识点