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响应中的数字字段
- 数学计算: 确保计算操作数的类型安全
- 数据清理: 过滤数组中的有效数字
- 配置验证: 验证配置文件中的数字设置