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'
}
注意事項
- NaN檢查:
isNumber(NaN)
返回false
- Infinity檢查:
isNumber(Infinity)
返回false
- 類型守衛: 這是一個TypeScript類型守衛函數
- 性能: 檢查操作很快,適合頻繁使用
- 嚴格檢查: 只接受真正的數字類型,不接受字符串數字
與其他方法的區別
typeof value === 'number'
: 原生檢查,但會接受NaN和InfinityNumber.isFinite(value)
: 檢查有限數字isNumber()
: radash提供的嚴格數字檢查
實際應用場景
- 表單驗證: 驗證用戶輸入的數字字段
- API處理: 驗證API響應中的數字字段
- 數學計算: 確保計算操作數的類型安全
- 數據清理: 過濾數組中的有效數字
- 配置驗證: 驗證配置文件中的數字設置