【第33期】| 19组 | arrify 转数组

496 阅读1分钟

本文参加了由公众号@若川视野 发起的每周源码共读活动, 点击了解详情一起参与。

源码篇

/**
  * 将任意值转为数组形式
  * 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命令有三个包,我们一一查阅了解。

xo

JavaScript/TypeScript linter (ESLint wrapper) with great defaults JavaScript/TypeScript linter(ESLint 包装器)具有很好的默认值

tsd

Check TypeScript type definitions 检查 TypeScript 类型定义

nodejs 测试工具 ava

Node.js test runner that lets you develop with confidence