狂跑的烤鸭 發表於 2021-10-30 00:23:00

TypeScript学习: 九、TypeScript的泛型

<h3>泛型的定义</h3>
<div>
<div>&nbsp;泛型,&nbsp;软件开发过程中,我们不仅要创建一致的定义良好的api,&nbsp;同时也要考虑可重用性。&nbsp;组件不仅能够支持当前的数据类型,同时也能支持未来的数据类型,这在创建大型系统时为你提供十分灵活的功能。</div>
<div>&nbsp;</div>
<div>在像C#和java这样的语言中,可以使用泛型来创建可重用的组件,&nbsp;一个组件可以支持多种数据类型的数据。这样用户就可以以自己的数据类型来使用组件。</div>
<div>&nbsp;</div>
<div>&nbsp;通俗理解,<span style="color: rgba(255, 0, 0, 1)">泛型就是解决&nbsp;类&nbsp;接口&nbsp;方法的复用性、以及对不特定数据类型的支持</span></div>
<div>&nbsp;</div>
</div>
<h3>泛型函数</h3>
<p> 有一个需求: 传入指定的参数类型 返回这个指定的参数类型&nbsp; &nbsp; 比如 要求参数类型是 string 返回 string&nbsp;&nbsp;要求参数类型是 number返回 number</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 只能返回string 的函数</span>
<span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> getData(val:string):string{
</span><span style="color: rgba(0, 0, 255, 1)">return</span> val + "返回字符串"<span style="color: rgba(0, 0, 0, 1)">;
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">只能返回number 的函数</span>
<span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> getData1(val:number):number{
    </span><span style="color: rgba(0, 0, 255, 1)">return</span> val; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 返回数字</span>
}</pre>
</div>
<p>&nbsp;</p>
<p>&nbsp; 这里用了两个函数去实习功能,如果还需要返回&nbsp;&nbsp;bloolean 类型是不是还需要再添加多一个函数去实现, 这样实现的话会出现了代码的冗余</p>
<p>&nbsp;有人就会想到用any类型去实现功能,</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> getData2(val:any):any{
    </span><span style="color: rgba(0, 0, 255, 1)">return</span> 123; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 返回number</span>
<span style="color: rgba(0, 0, 0, 1)">}
getData2(</span>"string");</pre>
</div>
<p>  用any可以实现功能, 但是会出现这样的错误, 我传入string类型, 返回了number ,不符合要求, 并且使用any类型就是抛弃typeScript的初衷了,放弃了类型检查</p>
<p>使用泛型解决问题:泛型可以支持不特定类型, 实现要求传入类型和返回的类型一致</p>
<div class="cnblogs_code">
<pre> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> T 表示泛型, 具体什么类型是调用的时候决定的</span>
<span style="color: rgba(0, 0, 255, 1)">function</span> getData&lt;T&gt;<span style="color: rgba(0, 0, 0, 1)">(val:T):T{
    </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> val;
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 调用:</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> number类型, 返回number 类型</span>
getData&lt;number&gt;(100<span style="color: rgba(0, 0, 0, 1)">);

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> string 类型</span>
getData&lt;string&gt;("张三"<span style="color: rgba(0, 0, 0, 1)">);

getData</span>&lt;<span style="color: rgba(0, 0, 255, 1)">boolean</span>&gt;(123); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 错误写法 定义Boolean类型,不能传入number类型的参数</span></pre>
</div>
<p>&nbsp;</p>
<p>&nbsp;如果要求函数返回必须为string类型的 泛型函数写法:</p>
<div class="cnblogs_code">
<pre> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 泛型函数, 指定返回string类型</span>
<span style="color: rgba(0, 0, 255, 1)">function</span> getData&lt;T&gt;<span style="color: rgba(0, 0, 0, 1)">(val:T):string{
    </span><span style="color: rgba(0, 0, 255, 1)">return</span> val + "val"<span style="color: rgba(0, 0, 0, 1)">;
}

getData</span>&lt;number&gt;(234<span style="color: rgba(0, 0, 0, 1)">);

getData</span>&lt;string&gt;("张三");</pre>
</div>
<p>&nbsp;</p>
<p>通过这两个例子可以看出 泛型 T 代表的是一种数据类型, 具体是什么数据类型,就是要调用该方法的时候传入指定的类型来确定的 。&nbsp;</p>
<p>&nbsp;getData&lt;T&gt;&nbsp; &nbsp; &nbsp;getData&lt;string&gt;&nbsp; &nbsp; &nbsp;该函数里面的所有T 都是泛型&nbsp;</p>
<h3>泛型类</h3>
<div>需求:比如有个最小的堆算法,&nbsp;需要同时支持返回数字和字符串两种类型,&nbsp;&nbsp;通过类的泛型来实现</div>
<div>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 不适用泛型类的写法</span>
<span style="color: rgba(0, 0, 0, 1)">class MinClass{
    public list:number[] </span>=<span style="color: rgba(0, 0, 0, 1)"> [];

    add(num:number):void{
      </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.list.push(num);
    }
    min():number {
      </span><span style="color: rgba(0, 0, 255, 1)">var</span> minNum = <span style="color: rgba(0, 0, 255, 1)">this</span>.list;
      </span><span style="color: rgba(0, 0, 255, 1)">for</span>(<span style="color: rgba(0, 0, 255, 1)">var</span> i = 0; i &lt; <span style="color: rgba(0, 0, 255, 1)">this</span>.list.length; i++<span style="color: rgba(0, 0, 0, 1)">) {
            </span><span style="color: rgba(0, 0, 255, 1)">if</span>(minNum &gt; <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.list) {
                minNum </span>= <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.list;
            }
      }
      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> minNum;
    }
}

</span><span style="color: rgba(0, 0, 255, 1)">var</span> m = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> MinClass();
m.add(</span>2<span style="color: rgba(0, 0, 0, 1)">);
m.add(</span>50<span style="color: rgba(0, 0, 0, 1)">);
m.add(</span>1<span style="color: rgba(0, 0, 0, 1)">);
console.log(m.min());</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 输出: 1</span></pre>
</div>
<p>&nbsp;这个列子可以实现的是number类型的最小堆算法,对于类型校验,不能使用string的类型</p>
<p>看看 泛型类的实现</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 泛型类</span>
class MinClass&lt;T&gt;<span style="color: rgba(0, 0, 0, 1)">{
    public list:T[] </span>=<span style="color: rgba(0, 0, 0, 1)"> [];

    add(num:T):void{
      </span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.list.push(num);
    }
    min():T {
      </span><span style="color: rgba(0, 0, 255, 1)">var</span> minNum = <span style="color: rgba(0, 0, 255, 1)">this</span>.list;
      </span><span style="color: rgba(0, 0, 255, 1)">for</span>(<span style="color: rgba(0, 0, 255, 1)">var</span> i = 0; i &lt; <span style="color: rgba(0, 0, 255, 1)">this</span>.list.length; i++<span style="color: rgba(0, 0, 0, 1)">) {
            </span><span style="color: rgba(0, 0, 255, 1)">if</span>(minNum &gt; <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.list) {
                minNum </span>= <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.list;
            }
      }
      </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> minNum;
    }
}

</span><span style="color: rgba(0, 0, 255, 1)">var</span> m = <span style="color: rgba(0, 0, 255, 1)">new</span> MinClass&lt;number&gt;<span style="color: rgba(0, 0, 0, 1)">(); // 实例化 类, 并且指定了泛型 的类型 为number
m.add(</span>2<span style="color: rgba(0, 0, 0, 1)">);
m.add(</span>50<span style="color: rgba(0, 0, 0, 1)">);
m.add(</span>1<span style="color: rgba(0, 0, 0, 1)">);
console.log(m.min());</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 输出: 1</span>

<span style="color: rgba(0, 0, 255, 1)">var</span> s = <span style="color: rgba(0, 0, 255, 1)">new</span> MinClass&lt;string&gt;<span style="color: rgba(0, 0, 0, 1)">();
s.add(</span>"n"<span style="color: rgba(0, 0, 0, 1)">);
s.add(</span>"a"<span style="color: rgba(0, 0, 0, 1)">);
s.add(</span>"z"<span style="color: rgba(0, 0, 0, 1)">);
console.log(s.min());</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 输出: a    码值计算</span></pre>
</div>
<p>使用泛型了, 可以写入number类型和string类型&nbsp;</p>
<p>&nbsp;</p>
<p><strong>--- 泛型类--- 进阶</strong></p>
<p>  要求:定义一个类,把类当作参数,来约束传入的数据类型</p>
<p>  实现:定义一个user的类,这个类的作用是映射数据库字段,&nbsp;然后定义个mysqlDb的类,用于操作数据库,然后把User类当作参数传入到mysqlDb执行</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 映射数据库字段的实体类</span>
<span style="color: rgba(0, 0, 0, 1)">class User{
    public username:string </span>|<span style="color: rgba(0, 0, 0, 1)"> undefined;
    public pasword:string </span>|<span style="color: rgba(0, 0, 0, 1)"> undefined;

    constructor() {

    }
}

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 数据库操作类型</span>
<span style="color: rgba(0, 0, 0, 1)">class MysqlDb{
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 添加数据</span>
    add(user:User):<span style="color: rgba(0, 0, 255, 1)">boolean</span><span style="color: rgba(0, 0, 0, 1)">{
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">;
    }
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 删除数据</span>
    <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 修改数据</span>
    <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> ----</span>
<span style="color: rgba(0, 0, 0, 1)">}

</span><span style="color: rgba(0, 0, 255, 1)">var</span> u = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> User();
u.username </span>= "张三"<span style="color: rgba(0, 0, 0, 1)">;
u.pasword </span>= "123"<span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">var</span> Db = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> MysqlDb();

Db.add(u);</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 把这个user添加到数据库中</span></pre>
</div>
<p>&nbsp;</p>
<p>&nbsp;这个&nbsp;MysqlDb 可以执行 user类 的添加等操作, 同样的问题:这个MysqlDb 只能对user 类进行操作, 如果我还有其他的表:</p>
<p>&nbsp;</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">class ArticleCate{
    title:string </span>|<span style="color: rgba(0, 0, 0, 1)"> undefined;
    desc:string </span>|<span style="color: rgba(0, 0, 0, 1)"> undefined;
    status:number </span>|<span style="color: rgba(0, 0, 0, 1)"> undefined;
    constructor() {

    }
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 数据库操作类型</span>
<span style="color: rgba(0, 0, 0, 1)">class MysqlDb{
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 添加数据</span>
    add(info:ArticleCate):<span style="color: rgba(0, 0, 255, 1)">boolean</span><span style="color: rgba(0, 0, 0, 1)">{
      console.log(info);
      </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">;
    }
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 删除数据</span>
    <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 修改数据</span>
    <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> ----</span>
<span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 0, 255, 1)">var</span> art = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> ArticleCate();
art.status </span>= 1<span style="color: rgba(0, 0, 0, 1)">;
art.desc </span>= "国内新闻"<span style="color: rgba(0, 0, 0, 1)">;
art.title </span>= "国内"<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">var</span> Db = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> MysqlDb();
Db.add(art);</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 把这个ArticleCate添加到数据库中</span></pre>
</div>
</div>
<p>是不是这样就出现了代码的冗余, 有多个要操作的实体类,就要定义多个&nbsp;&nbsp;MysqlDb 去实现</p>
<p>来看看泛型如何实现, 把&nbsp;MysqlDb&nbsp; 就封装一次</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 映射数据库字段的实体类</span>
<span style="color: rgba(0, 0, 0, 1)">class User{
    public username:string </span>|<span style="color: rgba(0, 0, 0, 1)"> undefined;
    public pasword:string </span>|<span style="color: rgba(0, 0, 0, 1)"> undefined;

    constructor() {

    }
}

class ArticleCate{
    title:string </span>|<span style="color: rgba(0, 0, 0, 1)"> undefined;
    desc:string </span>|<span style="color: rgba(0, 0, 0, 1)"> undefined;
    status:number </span>|<span style="color: rgba(0, 0, 0, 1)"> undefined;
    constructor() {

    }
}

</span><span style="color: rgba(0, 0, 255, 1)">var</span> art = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> ArticleCate();
art.status </span>= 1<span style="color: rgba(0, 0, 0, 1)">;
art.desc </span>= "国内新闻"<span style="color: rgba(0, 0, 0, 1)">;
art.title </span>= "国内"<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">var</span> DbArt = <span style="color: rgba(0, 0, 255, 1)">new</span> MysqlDb&lt;ArticleCate&gt;(); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 直接实例化 mysqlDb</span>
DbArt.add(art);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 把这个ArticleCate添加到数据库中</span>

<span style="color: rgba(0, 0, 255, 1)">var</span> user = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> User();
user.username </span>= "张三"<span style="color: rgba(0, 0, 0, 1)">;
user.pasword </span>= "24123"<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">var</span> DbUser = <span style="color: rgba(0, 0, 255, 1)">new</span> MysqlDb&lt;User&gt;<span style="color: rgba(0, 0, 0, 1)">();
DbUser.add(user); </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 把这个User添加到数据库中</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> DbUser.add(123); // 错误写法, 有类型校验</span></pre>
</div>
<p>&nbsp;</p>
<p>所以泛型, 不仅可以代表基本数据类型, 也可以是定义的类</p>
<h3>&nbsp;</h3>
<h3>泛型接口</h3>
<p>先来看一个函数接口</p>
<div class="cnblogs_code">
<pre> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 函数接口</span>
<span style="color: rgba(0, 0, 0, 1)">interface ConfigFn{
    (val: string, val2: string):string;
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 实现接口</span>
<span style="color: rgba(0, 0, 255, 1)">var</span> getData:ConfigFn = <span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)">(val1:string, val2:string):string{
    </span><span style="color: rgba(0, 0, 255, 1)">return</span> val1 +<span style="color: rgba(0, 0, 0, 1)"> val2;
}

</span><span style="color: rgba(0, 0, 255, 1)">var</span> str:string = getData("张三", "李四"<span style="color: rgba(0, 0, 0, 1)">);

console.log(str);</span></pre>
</div>
<p>&nbsp;</p>
<p>&nbsp;再来看看泛型接口</p>
<div class="cnblogs_code">
<pre> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 泛型函数接口</span>
<span style="color: rgba(0, 0, 0, 1)">interface ConfigFn{
    </span>&lt;T&gt;<span style="color: rgba(0, 0, 0, 1)">(val: T, val2: T):T;
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 实现泛型函数接口</span>
<span style="color: rgba(0, 0, 255, 1)">var</span> getData:ConfigFn = <span style="color: rgba(0, 0, 255, 1)">function</span>&lt;T&gt;<span style="color: rgba(0, 0, 0, 1)">(val1:T, val2:T):T{
    </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> val1;
}

</span><span style="color: rgba(255, 0, 0, 1)">var str:string = getData&lt;string&gt;("张三", "李四"</span><span style="color: rgba(0, 0, 0, 1)"><span style="color: rgba(255, 0, 0, 1)">);</span>

console.log(str);</span></pre>
</div>
<p>&nbsp;</p>
<p>&nbsp;实现泛型接口的时候, 不指定泛型类型, 到调用的时候再指定类型</p>
<p>另外一种写法</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 泛型函数接口的另外一种写法</span>
interface ConfigFn&lt;T&gt;<span style="color: rgba(0, 0, 0, 1)"> {
    (val: T, val2: T):T;
}

</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 定义函数</span>
<span style="color: rgba(0, 0, 255, 1)">function</span> getData&lt;T&gt;<span style="color: rgba(0, 0, 0, 1)">(val1:T, val2:T):T{
    </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> val1;
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 实现接口, 并且指定类型</span>
<span style="color: rgba(0, 0, 255, 1)">var</span> myGetData:ConfigFn&lt;string&gt; =<span style="color: rgba(0, 0, 0, 1)"> getData;

myGetData(</span>"张三", "李四");</pre>
</div>
<p><span style="color: rgba(255, 0, 0, 1)">注意: 实现泛型接口,本身也要是一个泛型</span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>有了泛型, 调用方法的时候,同样的代码,可供多个类型使用,大大的扩展了代码的复用性&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h2>使用&nbsp;类,接口,泛型,&nbsp;实现SQL底层封装</h2>
<p>  sql 数据库类的简单功能有: 查询, 添加, 修改, 删除 ,先从这四个功能起封装库类, 先定义一个泛型接口</p>
<div class="cnblogs_code">
<pre>// 定义基础接口
interface DBI&lt;T&gt;<span>{
    add(info:T): boolean<span>;
    update(info:T,id:number): boolean<span>;
    delete(id:number): boolean<span>;
    get(id:number): any[];
}</span></span></span></span></pre>
</div>
<p>&nbsp;</p>
<p>  简单实现接口,&nbsp;注意:&nbsp;要实现泛型接口, 这个类也是必须是泛型类</p>
<div class="cnblogs_code">
<pre>// 定义一个操作mysql数据库类, 实现接口, 注意要实现泛型接口, 这个类也是泛型类
class MysqlDb&lt;T&gt; implements DBI&lt;T&gt;<span> {<br></span></pre>
<div>
<div>    constructor()&nbsp;{</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;数据库建立连接-------</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;  }</div>
</div>
<pre><span>
    add(info: T): boolean<span> {
      throw new Error("Method not implemented."<span>);
    }
    update(info: T, id: number): boolean<span> {
      throw new Error("Method not implemented."<span>);
    }
    delete(id: number): boolean<span> {
      throw new Error("Method not implemented."<span>);
    }
    get(id: number): any[] {
      throw new Error("Method not implemented."<span>);
    }
   
}

// 实现sqlserver 的数据库类
class SqlserverDb&lt;T&gt; implements DBI&lt;T&gt;<span> {<br></span></span></span></span></span></span></span></span></span></pre>
<div>
<div>  &nbsp; constructor()&nbsp;{</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;数据库建立连接-------</div>
<div>&nbsp; &nbsp; &nbsp;}</div>
</div>
<pre><span>
    add(info: T): boolean<span> {
      throw new Error("Method not implemented."<span>);
    }
    update(info: T, id: number): boolean<span> {
      throw new Error("Method not implemented."<span>);
    }
    delete(id: number): boolean<span> {
      throw new Error("Method not implemented."<span>);
    }
    get(id: number): any[] {
      throw new Error("Method not implemented."<span>);
    }
   
}</span></span></span></span></span></span></span></span></pre>
</div>
<p>&nbsp;</p>
<p>实现mysql数据类操作User数据表,, 使用泛型, 把类当作参数来约束方法</p>
<div class="cnblogs_code">
<pre>// 定义实体类, 映射数据库表的类
<span>class User{
    id: number |<span> undefined;
    userName:string |<span> undefined;
    password:string |<span> undefined;
}

var user = new<span> User();
user.id = 1<span>;
user.userName = "tom"<span>;
user.password = "12345678"<span>;


// 实现user类的数据库操作
var UserMysql = new MysqlDb&lt;User&gt;();</span></span></span></span></span></span></span></span></pre>
</div>
<p>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/yangWanSheng/p/15417092.html
頁: [1]
查看完整版本: TypeScript学习: 九、TypeScript的泛型