Typescript中[]是合法类型吗?与any[]是否等价?
关于TypeScript中[]类型的疑问解答
1. []是不是TypeScript中的合法类型?
是,但它属于空元组类型,不是泛指的普通数组类型。
它的严格语义是「长度为0、不包含任何元素的数组」,如果你给变量声明这个类型,那这个变量只能被赋值为空数组,赋值任何非空数组都会触发类型错误。你现在的代码没有报类型警告,基本是因为没有开启TypeScript的严格模式检查,属于类型宽松下的漏检情况。
2. []和any[]是否等价?
二者完全不等价,核心差异如下:
any[]代表元素类型为any、长度不受限制的数组,支持任意类型的元素插入、长度也可以随意修改[]作为类型时是固定长度为0的元组,不允许添加任何元素,尝试访问[][0]时TypeScript会直接提示该位置不存在有效元素
现有代码的隐性问题
你当前写的类型注解不符合实际的业务逻辑:
- 参数
s: string | []相当于限制非字符串的入参只能是空数组,如果你传[1, 2, 3]这类非空数组作为参数,会直接触发类型不匹配的报错 - 返回值声明为
[]也不符合实际逻辑,你解析字符串得到的数组大概率是有元素的,只是现在TS宽松模式没有识别到这个类型冲突 - 额外注意:你现有代码里把单引号替换为
"是错误的,"是HTML实体,JSON.parse无法识别为JSON的引号标识,应该替换为普通双引号"才对
符合预期的类型注解写法应该是:
function stringToArray(s: string | any[]): any[] { return typeof s === 'string' ? JSON.parse(s.replace(/'/g, '"')) : s; }
内容的提问来源于stack exchange,提问作者Scipion
相关产品推荐
相关产品推荐

