Skip to content

isNumber

检查值是否为数字类型。

基础用法

typescript
import { isNumber } from 'radash'

console.log(isNumber(123))           // true
console.log(isNumber(3.14))          // true
console.log(isNumber('123'))         // false
console.log(isNumber(NaN))           // false
console.log(isNumber(Infinity))      // false

语法

typescript
function isNumber(value: any): value is number

参数

  • value (any): 要检查的值

返回值

返回一个布尔值,表示该值是否为有效的数字类型。这是一个类型守卫函数。

示例

基本数字检查

typescript
import { isNumber } from 'radash'

// 整数
console.log(isNumber(0))             // true
console.log(isNumber(123))           // true
console.log(isNumber(-456))          // true
console.log(isNumber(Number.MAX_SAFE_INTEGER)) // true

// 浮点数
console.log(isNumber(3.14))          // true
console.log(isNumber(-2.5))          // true
console.log(isNumber(0.0))           // true
console.log(isNumber(1e10))          // true

处理特殊数字值

typescript
import { isNumber } from 'radash'

// NaN 不是有效数字
console.log(isNumber(NaN))           // false

// Infinity 不是有效数字
console.log(isNumber(Infinity))      // false
console.log(isNumber(-Infinity))     // false

// 零值
console.log(isNumber(0))             // true
console.log(isNumber(-0))            // true

处理字符串数字

typescript
import { isNumber } from 'radash'

// 字符串不是数字类型
console.log(isNumber('123'))         // false
console.log(isNumber('3.14'))        // false
console.log(isNumber('0'))           // false
console.log(isNumber(''))            // false
console.log(isNumber('hello'))       // false

处理其他类型

typescript
import { isNumber } from 'radash'

// 布尔值
console.log(isNumber(true))          // false
console.log(isNumber(false))         // false

// null 和 undefined
console.log(isNumber(null))          // false
console.log(isNumber(undefined))     // false

// 对象和数组
console.log(isNumber({}))            // false
console.log(isNumber([]))            // false
console.log(isNumber({ value: 123 })) // false

// 函数
console.log(isNumber(() => {}))      // false
console.log(isNumber(function() {})) // false

// Symbol
console.log(isNumber(Symbol()))      // false

类型守卫用法

typescript
import { isNumber } from 'radash'

function processValue(value: unknown) {
  if (isNumber(value)) {
    // TypeScript 知道 value 是 number 类型
    return value * 2
  }
  
  return 'Not a number'
}

console.log(processValue(5))         // 10
console.log(processValue('hello'))   // 'Not a number'
console.log(processValue(null))      // 'Not a number'

数组过滤

typescript
import { isNumber } from 'radash'

const mixedArray = [1, 'hello', 3.14, true, 0, 'world', -5]

const numbers = mixedArray.filter(isNumber)
console.log(numbers) // [1, 3.14, 0, -5]

// 计算数字的总和
const sum = mixedArray
  .filter(isNumber)
  .reduce((acc, num) => acc + num, 0)

console.log(sum) // -0.86 (1 + 3.14 + 0 + (-5))

表单验证

typescript
import { isNumber } from 'radash'

function validateFormData(data: Record<string, any>) {
  const errors: string[] = []
  
  if (!isNumber(data.age)) {
    errors.push('Age must be a number')
  }
  
  if (!isNumber(data.score)) {
    errors.push('Score must be a number')
  }
  
  if (isNumber(data.age) && data.age < 0) {
    errors.push('Age cannot be negative')
  }
  
  if (isNumber(data.score) && (data.score < 0 || data.score > 100)) {
    errors.push('Score must be between 0 and 100')
  }
  
  return errors
}

const formData = {
  name: 'Alice',
  age: '25', // 字符串,不是数字
  score: 85
}

const errors = validateFormData(formData)
console.log(errors) // ['Age must be a number']

API响应处理

typescript
import { isNumber } from 'radash'

function processApiResponse(response: any) {
  const processed = {
    id: isNumber(response.id) ? response.id : 0,
    count: isNumber(response.count) ? response.count : 0,
    rating: isNumber(response.rating) ? response.rating : 0,
    price: isNumber(response.price) ? response.price : 0
  }
  
  return processed
}

const apiResponse = {
  id: '123', // 字符串
  count: 45,
  rating: null,
  price: 99.99
}

const processed = processApiResponse(apiResponse)
console.log(processed) // { id: 0, count: 45, rating: 0, price: 99.99 }

数学计算

typescript
import { isNumber } from 'radash'

function safeMathOperation(a: unknown, b: unknown, operation: 'add' | 'subtract' | 'multiply' | 'divide') {
  if (!isNumber(a) || !isNumber(b)) {
    throw new Error('Both operands must be numbers')
  }
  
  switch (operation) {
    case 'add':
      return a + b
    case 'subtract':
      return a - b
    case 'multiply':
      return a * b
    case 'divide':
      if (b === 0) {
        throw new Error('Division by zero')
      }
      return a / b
    default:
      throw new Error('Invalid operation')
  }
}

console.log(safeMathOperation(5, 3, 'add'))      // 8
console.log(safeMathOperation(10, 4, 'divide'))  // 2.5

try {
  safeMathOperation('5', 3, 'add')
} catch (error) {
  console.log(error.message) // 'Both operands must be numbers'
}

配置验证

typescript
import { isNumber } from 'radash'

function validateConfig(config: any) {
  const errors: string[] = []
  
  const requiredNumbers = [
    { key: 'port', min: 1, max: 65535 },
    { key: 'timeout', min: 0, max: 300000 },
    { key: 'maxConnections', min: 1, max: 1000 }
  ]
  
  for (const { key, min, max } of requiredNumbers) {
    const value = config[key]
    
    if (!isNumber(value)) {
      errors.push(`${key} must be a number`)
    } else if (value < min || value > max) {
      errors.push(`${key} must be between ${min} and ${max}`)
    }
  }
  
  return errors
}

const config = {
  port: '3000', // 字符串
  timeout: 5000,
  maxConnections: 100
}

const errors = validateConfig(config)
console.log(errors) // ['port must be a number']

数据清理

typescript
import { isNumber } from 'radash'

function cleanNumericData(data: any[]) {
  return data
    .filter(isNumber)
    .filter(num => !isNaN(num) && isFinite(num))
}

const rawData = [1, 'hello', 3.14, NaN, Infinity, -5, 'world', 0, null]

const cleanData = cleanNumericData(rawData)
console.log(cleanData) // [1, 3.14, -5, 0]

类型安全的计算

typescript
import { isNumber } from 'radash'

function calculateAverage(values: unknown[]): number {
  const numbers = values.filter(isNumber)
  
  if (numbers.length === 0) {
    return 0
  }
  
  const sum = numbers.reduce((acc, num) => acc + num, 0)
  return sum / numbers.length
}

const values = [1, 'hello', 3, 'world', 5, null, 7]

const average = calculateAverage(values)
console.log(average) // 4 (1 + 3 + 5 + 7 = 16, 16 / 4 = 4)

参数验证

typescript
import { isNumber } from 'radash'

function createUser(name: string, age: unknown, score: unknown) {
  if (!isNumber(age) || age < 0 || age > 150) {
    throw new Error('Age must be a valid number between 0 and 150')
  }
  
  if (!isNumber(score) || score < 0 || score > 100) {
    throw new Error('Score must be a valid number between 0 and 100')
  }
  
  return {
    name,
    age,
    score,
    isAdult: age >= 18,
    grade: score >= 90 ? 'A' : score >= 80 ? 'B' : score >= 70 ? 'C' : 'D'
  }
}

try {
  const user = createUser('Alice', 25, 85)
  console.log(user) // { name: 'Alice', age: 25, score: 85, isAdult: true, grade: 'B' }
} catch (error) {
  console.log(error.message)
}

try {
  createUser('Bob', '30', 95) // age 是字符串
} catch (error) {
  console.log(error.message) // 'Age must be a valid number between 0 and 150'
}

注意事项

  1. NaN检查: isNumber(NaN) 返回 false
  2. Infinity检查: isNumber(Infinity) 返回 false
  3. 类型守卫: 这是一个TypeScript类型守卫函数
  4. 性能: 检查操作很快,适合频繁使用
  5. 严格检查: 只接受真正的数字类型,不接受字符串数字

与其他方法的区别

  • typeof value === 'number': 原生检查,但会接受NaN和Infinity
  • Number.isFinite(value): 检查有限数字
  • isNumber(): radash提供的严格数字检查

实际应用场景

  1. 表单验证: 验证用户输入的数字字段
  2. API处理: 验证API响应中的数字字段
  3. 数学计算: 确保计算操作数的类型安全
  4. 数据清理: 过滤数组中的有效数字
  5. 配置验证: 验证配置文件中的数字设置

Released under the MIT License.