关于使用as any localCompare类型断言的疑问

来源:9-3 【泛型函数重载应用准备】经典复杂排序器的实现 1

Loogeek

2021-09-06

图片描述1. 老师这里泛型是不是应该写Array或者直接用string更好呢?因为会用到字符串的localeCompare方法,如果传入的元素不是字符串,那运行时方法应该是会报错的,看下面是调用这个方法前通过isChinese做了类型保护判断,如果其他调用方法没有做类型保护到运行时就出错了,感觉写as any就没办法做类型检查了

写回答

2回答

keviny79

2021-09-06

// 最佳答案: 这样写:为什么呢?主要考虑 第S100行  这样有限制的字符串数组

// 尽管直接改写成string 也可以,但下面写法是最佳推荐写法 ,老师把这个作为思考题留给你,如果实在想不出来再在问答区提问

function sortChinese<T extends string>(arr: Array<T>): T[] {//Array<T>=T[]

  return arr.sort(function (firstnum, secondnum) {

    return (firstnum as any).localeCompare(secondnum, "zh-CN")

  })

}

// S100 一些底层,如路由器底层泛型,用到了这种限制数据个数的值类型数组

type pathValueType = "searchFood" | ":foodname" | ":price"

let arr: Array<pathValueType> = ["searchFood", ":foodname"]

let result100 = sortChinese<pathValueType>(arr) //S101


// 不能将类型“"abc"”分配给类型“pathValueType”

let arr2: Array<pathValueType> = ["searchFood", ":foodname","abc"]


0
2
keviny79
回复
Loogeek
我忘记删除了 as any ,你把鼠标放到S101行 上既可以看出 直接用 string 和 T extends string 的区别 ,T extends string 更直观展示pathValueType当前类型
2021-09-07
共2条回复

keviny79

2021-09-06

//img.mukewang.com/szimg/613602330809667811310494.jpg

参加截图

0
0

晋级TypeScript高手,成为抢手的前端开发人才

轻松驾驭 TypeScript 高级用法, 突破前端成长瓶颈

871 学习 · 425 问题

查看课程