在 Typescript 中注释函数

在 TypeScript 中注释函数的最基本方式是这样的
function add(a: number, b: number): number{
// logic
}
// or
const add = (a: number, b: number): number => {
//logic
}**可选参数用问号 param? 注释,像这样**
function optional(a: number, b?: number){
console.log(a)
}但是**回调函数**,或者参数类型和返回类型相关的函数呢()。
函数值
观察此 JavaScript 函数
function multiplier(factor){
return value => factor * value
}这样我们就可以像这样使用该函数;
const n = multiplier(6) n(8) // 48
函数值在 TypeScript 中的注释如下
(param1: type, param2: type)=> type
// or
const add: (a: number, b: number)=> number = function (a, b){
return a + b
}因此,为了注释“乘数”函数,我们有
function multiplier(factor: number): (value: number) => number{
return value => factor * value
}你的 IDE(最好是 VSCode)将自动推断函数逻辑中的“值”的类型()
泛型函数
此函数注释错误
function pickFirst(array: Array): T{ return array[0] }
当然,这会引发一个错误
`无法找到名称 T`
因此,注释泛型函数的格式为
function fnName(param: T): U{ //logic }
观察通用名称的声明位置。因此,正确注释上述函数;
function pickFirst(array: Array ): T{ return array[0] }
**现在可以了。**
**但是具有函数参数的通用函数怎么办**。
例如,我们想要注释一个名为“myMap”的自定义“map”函数,它在 Javascript 中是这样写的
function myMap(arr, fn){
rreturn arr.map(fn)
}我们可以像这样注释
function myMap(arr: Input[], fn: (item: Input, index?: number) => Output): Output[]{
return arr.map(fn)
}我们应该在上面的代码片段中注意的是,`fn` 函数接受与 `Input` 数组相同类型的项并返回 `Output` 类型。
**静态 Array.from() 方法怎么样?**
function myFrom(iterable: Iterable ): Array { // logic }
**或者 array.filter() 方法?**
function myFilter(arr: Input[], fn: (item: Input) => boolean): Input[]{
return arr.filter(fn)
}通用约束
您还可以将泛型变量限制为具有特定属性的类型。例如,
function pickInnerFirst(array: Array ): T{ return array[0][0] }
此函数选取二维数组中的第一个元素
这确保它只适用于数组和字符串()
pickOne([12, 20, 30]) // wont work.
我们还可以使用**接口**
interface Lengthly{
length: number;
}
function pickInnerFirst(array: Array): T{
return array[0][0]
} 函数接口
如果你不知道的话,**函数是对象**,并且它们具有属性
const add = (a, b) => a + b console.log(add.toString()) //(a, b) => a + b // also console.log(Object.getPrototypeOf(add) == Function.prototype) //true console.log(Object.getPrototypeOf(Function.prototype) == Object.prototype) //true
第二个例子表明“add”函数是“Object.prototype”()的子函数,因此是一个对象。
**有趣的是**你可以在 JavaScript 中将属性附加到函数
function shout(fn, value){
fn(value)
console.log(fn.description)
}
function hey(value){
console.log(value)
}
hey.description = `A function called ${hey.name}` // A
shout(hey, "Hola!!!")此代码片段将返回
>> Hola!!! >> A function called hey
请注意,在**A**处,我们为函数附加了一个名为“description”的属性,这只有通过**对象**才有可能实现。
也就是说得出结论;
对象可以用接口 () 来描述。对于函数,这也是可能的。但是,**只有在向函数添加特殊属性时才需要考虑这一点。**
interface describableFunction{
(value: string): void; //A
description: string;
}在注释**A**中我们描述了函数的参数和返回类型。
因此,要在 TypeScript 中注释早期的代码,
interface describableFunction{
(value: string): void;
description: string;
}
function shout(fn: describableFunction, value: string) { //A
fn(value)
console.log(fn.description)
}
function hey(value: string) {
console.log(value)
}
hey.description = `A function called ${hey.name}`
shout(hey, "Hola!!!")观察我们在 A 处的 `shout` 函数中使用接口的方式。
为什么我应该了解如何在 Typescript 中注释函数?
嗯,它有助于构建更智能的类型系统,从而减少出现错误的机会。如果您正在构建库或框架,则可能必须使用此处提到的部分或大部分概念。
如果您只是使用库,那么这些概念并不是真正必要的,即使它们可以让您更深入地了解您正在使用的库。
**如果您有任何疑问或本文中有错误,请在下面的评论中分享⭐**