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.