9.泛型
<p>定义⼀个函数或类时,有些情况下⽆法确定其中要使⽤的具体类型(返回值、参数、属性的类型不能确定),此时就需要泛型了
举例: <code>&lt;T&gt;</code>就是泛型,(不⼀定⾮叫 <code>T</code>),设置泛型后即可在函数中使⽤<code>T</code> 来表示该类型:</p>
<pre><code>function test&lt;T&gt;(arg: T): T{
return arg;
}
// 不指名类型,TS会⾃动推断出来
test(10)
// 指名具体的类型
test&lt;number&gt;(10)</code></pre>
<p>泛型可以写多个:</p>
<pre><code>function test&lt;T, K&gt;(a: T, b: K): K{
return b;
}
// 为多个泛型指定具体⾃值
test&lt;number, string&gt;(10, &quot;hello&quot;);</code></pre>
<p>类中同样可以使⽤泛型:</p>
<pre><code>class MyClass&lt;T&gt;{
prop: T;
constructor(prop: T){
this.prop = prop;
}
}</code></pre>
<p>也可以对泛型的范围进⾏约束:</p>
<pre><code>interface Demo{
length: number;
}
// 泛型T必须是MyInter的⼦类,即:必须拥有length属性
function test&lt;T extends Demo&gt;(arg: T): number{
return arg.length;
}
test(10) // 类型“number”的参数不能赋给类型“Demo”的参数
test({name:'张三'}) // 类型“{ name: string; }”的参数不能赋给类型“Demo”的参数
test('123')
test({name:'张三',length:10})</code></pre>