当前位置: 首页 > 科技观察

泛型,很多人因此放弃学习TypeScript?

时间:2023-03-21 23:08:07 科技观察

1。ts的泛型难吗?如果你:刚开始学习ts,刚开始接触泛型,正在为学习ts泛型而苦恼,看到下面的代码是不是一头雾水?functionmakePair()Java像typescript一样支持泛型。当我在大学开始学习Java时,我还是一名编码新手。遇到困难(比如泛型)就直接跳了。不过,能学多少,回宿舍就被LOL拉黑了。直到大学毕业,我仍然不明白泛型的概念。也许你和我一样觉得泛型很难。下面分享一下我的理解,希望对大家有所帮助。2、我们来看一下makeState()函数。首先,我编写了makeState函数。我们将使用这个函数来讨论通用函数两个函数getState()和setState()。试试看,下面的代码会打印出什么const{getState,setState}=makeState()setState(1)console.log(getState())setState(2)console.log(getState())12session打印出12并没有那么难,对吧?注意:如果你正在使用React,你可能会发现makeState()与钩子函数useState()非常相似。这也涉及到闭包和ES6解构赋值3.当我们传入一个字符串会发生什么?如果我们将刚刚给setState的输入参数1和2替换为字符串'foo',将会输出什么?const{getState,setState}=makeState()setState('foo')console.log(getState())Argumentoftype'"foo"'isnotassignabletoparameteroftype'number'。编译会失败,因为setState()要求的参数类型是number。这个问题可以用functionmakeState(){//Changetostringletstate:stringfunctiongetState(){returnstate}//AcceptsastringfunctionsetState(x:string){state=x}return{getState,setState}}const{getState,setState}=makeState()setState('foo')console.log(getState())foo4。挑战:为了获得两种不同类型的状态,我们是否可以修改函数makeState()来输出两种不同类型的状态,例如,一种是字符串,一种是数字。下面的代码简单表达了我想表达的意思://Onethatonlyallowsnumbers,and...constnumState=makeState()numState.setState(1)console.log(numState.getState())//1//Theotherthatonlyallowsstrings.conststrState=makeState()strState.setState('foo')console.log(strState.getState())//foo要实现上面的效果,我们可能需要创建两个内部不同的makeState(),一个状态类型是数字,另一个是一个字符串。怎么只写一个就可以实现呢?5.实验一:设置多种类型这是我们的第一次尝试:makeState()//数字numAndStrState.setState(1)console.log(numAndStrState.getState())//字符串numAndStrState.setState('foo')console.log(numAndStrState.getState())1foo结果看来我们已经成功了,但这不是我真正想要的。我们真正想要实现的是,我们只能输出数字状态,只能输出字符串状态。numAndStrState既可以输出数值类型,也可以输出字符串类型6.实现2:使用泛型接下来,我们的泛型就会出现:getState,setState}}makeState()定义为makeState(),可以将作为函数参数,但它传入的不是值,而是类型。比如你可以传入一个数字类型:makeState(),makeSate()函数里面的state就会变成一个数字类型letstate:S//<-numberfunctionsetState(x:S/*<-number*/){state=x}这样,只有数字状态//createsanumber-onlystateconstnumState=makeState()numState.setState(1)console.log(numState.getState())//numState.setState('foo')输入字符串foo会报错。同样,我们只能输出字符串state//Createsstring-onlystateconststrState=makeState()strState.setState('foo')console.log(strState.getState())//strState.setState(1)会报一个如果输入数字1会报错都可以,但是一般我们会用变量首字母大写来表示变量的类型:T(for“T”ype)E(for“E”lement)K(for“K”ey)V(for“V”alue)7.泛型范围限制目前我们改进的makeState()实现了只能输出数字状态和字符串状态。但它也可以输出布尔值。//Createsaboolean-onlystateconstboolState=makeState()boolState.setState(true)console.log(boolState.getState())问题:那么如何限制只能输入输出数字和字符串类型呢?方法:在声明makeState()函数时,将类型参数改为,这样就只能输入数字或字符串的类型}//如果我传入boolean类型constboolState=makeState()Type'boolean'doesnotsatisfytheconstraint'string|number'.8、genericdefaulttype现在我们每次调用makeState()时,我们可以传入任意类型的,那么如何设置一个默认类型呢?例如,让下面的两个语句具有相同的效果:constnumState1=makeState()constnumState2=makeState()实际上与为函数参数设置默认值相同:functionmakeState()这样,变量state默认为类型为numberconstnumState=makeState()numState.setState(1)console.log(numState.getState())19.总结泛型其实可以作为普通函数的参数,当它们被声明,这个参数代表类型。我们可以为函数值参数设置默认值,或者通过typescript泛型为函数类型参数设置默认值。functionregularFunc(x=2)regularFunc()functiongenericFunc()genericFunc()