函数类型表达式
// 函数类型表达式
function greeter(fn:(a:string) =>void){
fn('hello world')
}
//上面的方法也可以讲 fun 拿出去写
//如
type GreetFunction = (s:string) =>void;
function greeter1(fn:GreetFunction){
fn('hello world')
}
function printToConsole(s:string){
console.log(s)
}
greeter(printToConsole)
// 调用签名
type DescribleFunction = {
description:string,
(someArg:number):boolean//传入number类型的值 并 返回 布尔值 的方法
}
function doSomethings(fn:DescribleFunction){
console.log(fn.description +'return' +fn(6))
}
function fn1(n:number){
console.log(n)
return true;
}
fn1.description ='hello';
doSomethings(fn1);
// 刚开始不太理解 fn1 为什么会继承 description 这块代码得从后往前看 就明白了。
构造签名 就是在调用签名 增加一个 new
class Ctor {
s:string
constructor(s:string) {
this.s = s;
}
}
type SomeCons = {
new (s:string):Ctor
}
function fn(ctor:SomeCons){
return new ctor('hello')
}
const f =fn(Ctor);
console.log(f.s)
interface CallOrConstructor {
new (s:string):Date
(n?:number):number
}
function fnx(date:CallOrConstructor){
let d =new date('2020-12-12');
let n = date(10);
}
// 泛型函数 -类型推断 Type 可以是任意 的 Sddd => 该函数传入的必须是Type类型的数组, 该函数返回值必须是 Type类型或者是undefined
// 传入啥类型 返回啥类型
function firstElement(arr:Type[]) :Type |undefined {
return arr[0]
}
firstElement(['1','2','3'])
firstElement(['1','2','3'])
firstElement([1,2,3])
firstElement([1,2,3])
firstElement([])
firstElement([])
// 写一个稍微复杂一点的泛型函数调用
function map(arr:Input[],func:(arg:Input) =>Output) :Output[] {
return arr.map(func)
}
const parsed =map(['1','2','3'],(n) =>parseInt(n))
泛型函数- 限制条件
function longerst(a:Type,b:Type){
if(a.length >= b.length){
return a
}else{
return b
}
}
const longerArray =longerst([1,2,3],[1,2,3]);
const longString =longerst('xxx','bbb')
//const notOk = longerst('10',10) // 错误示范