赞
踩
目录
参数列表里面的每个参数都需要名称和类型。
我们可以给每个参数添加类型之后再为函数本身添加返回值类型。
TypeScript能够根据返回语句自动推断出返回值类型,因此我可以省略它。
函数形参必须声明数据类型,返回值可以不声明数据类型(根据函数体种的逻辑推到出的)
- //声明式,作用域中直接声明function
- function add(x: number, y: number): number {
- return x + y;
- }
- function fm(n1:number,n2:string):[number,string]{
- return [n1*2,n2]
- }
- function fm3(n1:number,n2:string):any[]{
- return [n1*2,n2,100]
- }
- //定义式(当作数据引用)
- let myAdd = function(x: number, y: number): number { return x + y; };
- let obj={fn:function():void{}};
- let arr=[function():void{}];
- (function(n:number):number{return n*2})(100)
传递给一个函数的参数个数必须与函数期望的参数个数一致。
- function buildName(firstName: string, lastName: string) {
- return firstName + " " + lastName;
- }
-
- let result1 = buildName("Bob"); // error, too few parameters
- let result2 = buildName("Bob", "Adams", "Sr."); // error, too many parameters
- let result3 = buildName("Bob", "Adams"); // ah, just right
在TypeScript里我们可以在参数名旁使用 `?`实现可选参数的功能。
可选参数必须跟在必选参数后面
当然,还可以给参数设置默认值,在所有必选参数后面带默认值的参数都是可选的,与可选参数一样,在调用函数的时候可以省略。
ps:带默认值的参数不需要放在必选参数的后面。 如果带默认值的参数出现在必须参数前面,用户必须明确的传入 `undefined`值从而来获得默认值。
- function buildName(firstName: string, lastName?: string) {
- if (lastName)
- return firstName + " " + lastName;
- else
- return firstName;
- }
-
- let result1 = buildName("Bob"); // works correctly now
- let result2 = buildName("Bob", "Adams", "Sr."); // error, too many parameters
- let result3 = buildName("Bob", "Adams"); // ah, just right
-
- function fn(a1:number,n1?:number,n2?:string):Array<number|string>{
- return [a1,n2]
- }
- fn(100) //因为第二个参数没传,所以是unde,在非严格模式下可以将undef传给任何类型
- fn(100,100,"hello")
-
- function fm (n2:string,n3?:number,n1:number=100) { //n1是可选默认
- }
- fm("hello")
在js里面叫rest参数 ...restArr。必须写在最后面
- function buildName(firstName: string, ...restOfName: string[]) {
- return firstName + " " + restOfName.join(" ");
- }
-
- let employeeName = buildName("Joseph", "Samuel", "Lucas", "MacKinzie");
-
- function fm (n1:number,n2:string,...reset) {
- console.log(reset)
- }
- fm(10,"hello",10,203,405,[10]) // [10,203,405,[10]]
- fm(10,"hello") //[]
-
- function fg (n1:number,n2:string,...reset:[number,string]) { //如果这样写元组,那参数必须传
- console.log(reset) //[100,"hello"]
- }
- fg(10,"hello",100,"hello")
-
- function fg2 (n1:number,n2:string,...reset:number[]) {
- console.log(reset)
- }
- fg2(10,"hello",100,"hello") //报错
- fg2(100,"helloo")
- fg2(100,"helloo",10,203,4)
- fg2(100,"helloo",[10,203,4]) //报错
-
- function fg (n1:number,n2:string,...reset:[number,string]):[any[],Array<number>] {
- return [[10,203,true],[10,20]]
- }
- fg(100,"hello",10,"hello")
变量的类型可以声明为函数类型;
- let myAdd: (x: number, y: number) => number =
- function(x: number, y: number): number { return x + y; };
2.函数类型属于自定义类型,包含两部分:参数类型和返回值类型;
- //声明一个变量并指定类型为自定义的函数类型
- let myadd:(x:number, y:number)=>number;
- //声明一个函数
- function add(x: number, y: number): number {
- return x + y;
- }
- //把函数赋值给类型为函数类型的变量
- myadd = add;
-
- //赋值匿名函数
- myadd = function(x: number, y: number): number {
- return x + y;
- }
- //赋值箭头函数
- myadd = (x: number, y: number):number=>{
- return x + y;
- }
3.只要参数类型是匹配的,那么就认为它是有效的函数类型,并不要求参数名一样,很多时候参数名是为了增加可读性
- let myAdd: (baseValue: number, increment: number) => number =
- function(x: number, y: number): number { return x + y; };
4.在函数和返回值类型之前使用( `=>`)符号,返回值类型是函数类型的必要部分,如果函数没有返回任何值,你也必须指定返回值类型为 `void`而不能留空。
- //这里是声明c变量是一个函数类型 函数类型的写法 必须是: (某某参数类)=>返回值 这个格式不是箭头函数只是表达函数类型的表达式
- let c:(n1:number,n2:[number])=>[number,string];
- //然后将c赋值给声明式的函数
- c=function(agr1:number,arg2:[number]):[number,string]{
- return [100,"hello"]
- }
- //也可以把c赋值给箭头函数
- c=(a1:number,a2:[number]):[number,string]=>{
- return[10,"a"]
- }
接口可以描述函数类型;为了使用接口表示函数类型,我们需要给接口定义一个调用签名。它就像是一个只有参数列表和返回值类型的函数定义。
自定函数类型代码往往很长,可以使用接口来封装该类型,之后使用接口来代表该类型
- //函数类型接口
- interface addType {
- (baseVaule:number, increValue:number):number
- }
- function add(x: number, y: number): number {
- return x + y;
- }
- let myadd1:addType = add;
- let myadd2:addType = (x:number, y:number):number=>{
- return x+y;
- }
-
- interface UseEffect{
- ():[] //没有参数,返回值是没有值的元组
- }
eg:
- interface callback1{
- (number):number
- }
- interface UseEffect{
- (number,callback1):[number]
- }
- interface obj1{ //对象
- age:number,
- name:string
- }
- interface UseMemo{
- (obj1):[obj1,UseEffect]
- }
- let reactuseEfeect:UseMemo;
- reactuseEfeect=function(arg1:obj1):[obj1,UseEffect] {
- function fg(n1:number,n2:callback1):[number]{
- return [100]
- }
- return [{age:20,name:"karen"},fg]
- }
- let [x,y]=reactuseEfeect({age:20,name:"karen"})
- // y的使用
- y(100,function(arg:number):number{
- return 1
- })
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。