本文参加了由公众号@若川视野 发起的每周源码共读活动, 点击了解详情一起参与。
源码篇
/**
* 将任意值转为数组形式
* value 入参任意数据类型
* [value] 返回数组
*/
export default function arrify(value) {
// 判断输入的值是null或者是undefined,结果返回 []
if (value === null || value === undefined) {
return [];
}
// 判断输入的值是数组类型,返回原有值
if (Array.isArray(value)) {
return value;
}
// 判断输入的值是字符串类型,返回[value]
if (typeof value === 'string') {
return [value];
}
// 判断对象是否是一个可迭代对象,返回[value]
if (typeof value[Symbol.iterator] === 'function') {
return [...value];
}
return [value];
}
测试case篇
/* eslint-disable @typescript-eslint/ban-types */
import {expectType, expectError, expectAssignable} from 'tsd';
import arrify from './index.js';
expectType<[]>(arrify(null)); // null -> []
expectType<[]>(arrify(undefined)); // undefined -> []
expectType<[string]>(arrify('🦄')); // '🦄' -> ['🦄']
expectType<string[]>(arrify(['🦄'])); // '🦄' -> ['🦄']
expectAssignable<[boolean]>(arrify(true)); // true -> [true]
expectType<[number]>(arrify(1)); // 1 -> [1]
expectAssignable<[Record<string, unknown>]>(arrify({})); // {} -> [ {} ]
expectType<[number, string]>(arrify([1, 'foo'])); // [1, 'foo'] -> [1, 'foo']
expectType<Array<string | boolean>>(
arrify(new Set<string | boolean>(['🦄', true]))
); // ['🦄', true] -> ['🦄', true]
expectType<number[]>(arrify(new Set([1, 2]))); // new Set([1, 2]) -> [1,2]
expectError(arrify(['🦄'] as const).push('')); // 2
expectType<[number, number] | []>(arrify(false ? [1, 2] : null)); // []
expectType<[number, number] | []>(arrify(false ? [1, 2] : undefined)); // []
expectType<[number, number] | [string]>(arrify(false ? [1, 2] : '🦄')); // ['🦄']
expectType<[number, number] | [string]>(arrify(false ? [1, 2] : ['🦄'])); // ['🦄']
expectAssignable<number[] | [boolean]>(arrify(false ? [1, 2] : true)); // [true]
expectAssignable<number[] | [number]>(arrify(false ? [1, 2] : 3)); [3]
expectAssignable<number[] | [Record<string, unknown>]>(arrify(false ? [1, 2] : {})); // [{}]
expectAssignable<number[] | [number, string]>(
arrify(false ? [1, 2] : [1, 'foo'])
); // [1, 'foo']
expectAssignable<number[] | Array<string | boolean>>(
arrify(false ? [1, 2] : new Set<string | boolean>(['🦄', true]))
); // [ '🦄', true ]
expectAssignable<number[] | [boolean] | [string]>(
arrify(false ? [1, 2] : (false ? true : '🦄'))
); // ['🦄']
test命令有三个包,我们一一查阅了解。
JavaScript/TypeScript linter (ESLint wrapper) with great defaults JavaScript/TypeScript linter(ESLint 包装器)具有很好的默认值
Check TypeScript type definitions 检查 TypeScript 类型定义
Node.js test runner that lets you develop with confidence