arrays - 数组函数有些不缩小类型,即使使用类型谓词,替代解决方案?
问题描述
当使用类型谓词和返回语句时,我希望数组函数可以缩小 dashArray 的类型。
- 如果 TypeScript 编译器更聪明的话,这是可以合理地做到的,还是我期望这样的事情是错误的?
- 这怎么能被重写以按预期工作?
export function parseAsDashArray(str: string | null): number[] | null {
if (!str) {
return null;
}
const values = str.split(/[\s,]+/g);
const dashArray = values.map((v) => parseAsPercentLength(v));
if (dashArray.some(isNull)) {
return null;
}
if (isOdd(dashArray.length)) {
dashArray.concat(dashArray);
}
return dashArray;
}
export function isNull(val: any): val is null {
return val === null;
}
export function parseAsPercentLength(val: string): number | null { ... }
编辑:这是我尝试粘贴到 TypeScript 游乐场的完整示例。
https://www.typescriptlang.org/play
function parseAsDashArray(str: string | null): number[] | null {
if (!str) {
return null;
};
const values = str.split(/[\s,]+/g);
const dashArray = values.map(parseAsPercentLength);
if (dashArray.some(el => el == null)) {
return null;
}
if (dashArray.length % 2 == 1) dashArray.concat(dashArray);
return dashArray;
}
function parseAsPercentLength(val: string): number | null {
return Number.parseFloat(val)
}
类型 '(number | null)[]' 不能分配给类型 'number[]'。输入'号码 | null' 不可分配给类型 'number'。“null”类型不能分配给“number”类型。
解决方案
export function parseAsDashArray(str: string | null): number[] | null {
if (!str) {
return null;
}
const values = str.split(/[\s,]+/g);
const parsedArray = values.map((v) => parseAsPercentLength(v));
const dashArray = parsedArray.filter(isValue);
if (dashArray.length < parsedArray.length) {
return null;
}
if (isOdd(dashArray.length)) {
dashArray.concat(dashArray);
}
return dashArray;
}
推荐阅读
- django - django-channels nginx 设置
- python - 选择具有不明确值分配的数据框行
- javascript - 从 Redux 的多个位置在中间件中添加 reducer
- kubernetes - 如何让入口控制器向外部 IP 发送流量?
- scala - 做 INSERT INTO ... SELECT FROM 的鹅毛笔方式
- python - 如何通过选项卡遍历在对象焦点上引起 ttk OptionMenu 下拉选择(扩展)?
- sql - Oracle SQL查询部门用户报表
- jenkins - 詹金斯 - 在 X 天后删除发布 HTML 报告,还是一些变体?
- google-bigquery - 如何为 Google Bigquery 表创建季度分区
- c++ - 使用 MPFR 将浮点数转换为字符串