isString
检查值是否为字符串类型。
基础用法
typescript
import { isString } from 'radash'
console.log(isString('hello')) // true
console.log(isString('')) // true
console.log(isString(123)) // false
console.log(isString(true)) // false
console.log(isString(null)) // false
语法
typescript
function isString(value: any): value is string
参数
value
(any): 要检查的值
返回值
返回一个布尔值,表示该值是否为字符串类型。这是一个类型守卫函数。
示例
基本字符串检查
typescript
import { isString } from 'radash'
// 普通字符串
console.log(isString('hello')) // true
console.log(isString('world')) // true
console.log(isString('123')) // true
console.log(isString('true')) // true
// 空字符串
console.log(isString('')) // true
console.log(isString(' ')) // true
// 特殊字符串
console.log(isString('Hello World')) // true
console.log(isString('你好')) // true
console.log(isString('123.45')) // true
处理其他类型
typescript
import { isString } from 'radash'
// 数字
console.log(isString(123)) // false
console.log(isString(3.14)) // false
console.log(isString(0)) // false
console.log(isString(NaN)) // false
// 布尔值
console.log(isString(true)) // false
console.log(isString(false)) // false
// null 和 undefined
console.log(isString(null)) // false
console.log(isString(undefined)) // false
// 对象和数组
console.log(isString({})) // false
console.log(isString([])) // false
console.log(isString({ name: 'Alice' })) // false
// 函数
console.log(isString(() => {})) // false
console.log(isString(function() {})) // false
// Symbol
console.log(isString(Symbol())) // false
类型守卫用法
typescript
import { isString } from 'radash'
function processValue(value: unknown) {
if (isString(value)) {
// TypeScript 知道 value 是 string 类型
return value.toUpperCase()
}
return 'Not a string'
}
console.log(processValue('hello')) // 'HELLO'
console.log(processValue(123)) // 'Not a string'
console.log(processValue(null)) // 'Not a string'
数组过滤
typescript
import { isString } from 'radash'
const mixedArray = ['hello', 123, 'world', true, '', null, 'test']
const strings = mixedArray.filter(isString)
console.log(strings) // ['hello', 'world', '', 'test']
// 计算字符串的总长度
const totalLength = mixedArray
.filter(isString)
.reduce((acc, str) => acc + str.length, 0)
console.log(totalLength) // 14 (5 + 5 + 0 + 4)
表单验证
typescript
import { isString } from 'radash'
function validateFormData(data: Record<string, any>) {
const errors: string[] = []
if (!isString(data.name) || data.name.trim() === '') {
errors.push('Name must be a non-empty string')
}
if (!isString(data.email) || !data.email.includes('@')) {
errors.push('Email must be a valid string with @ symbol')
}
if (!isString(data.phone) || data.phone.length < 10) {
errors.push('Phone must be a string with at least 10 characters')
}
return errors
}
const formData = {
name: 'Alice',
email: 'alice@example.com',
phone: '1234567890'
}
const errors = validateFormData(formData)
console.log(errors) // []
const invalidFormData = {
name: '', // 空字符串
email: 123, // 数字
phone: '123' // 太短
}
const invalidErrors = validateFormData(invalidFormData)
console.log(invalidErrors) // ['Name must be a non-empty string', 'Email must be a valid string with @ symbol', 'Phone must be a string with at least 10 characters']
API响应处理
typescript
import { isString } from 'radash'
function processApiResponse(response: any) {
const processed = {
message: isString(response.message) ? response.message : 'No message',
error: isString(response.error) ? response.error : null,
data: isString(response.data) ? JSON.parse(response.data) : response.data
}
return processed
}
const apiResponse = {
message: 'Success',
error: null,
data: { id: 1, name: 'Alice' }
}
const processed = processApiResponse(apiResponse)
console.log(processed) // { message: 'Success', error: null, data: { id: 1, name: 'Alice' } }
const errorResponse = {
message: 500, // 数字
error: 'Internal server error',
data: null
}
const errorProcessed = processApiResponse(errorResponse)
console.log(errorProcessed) // { message: 'No message', error: 'Internal server error', data: null }
字符串处理
typescript
import { isString } from 'radash'
function safeStringOperation(value: unknown, operation: 'uppercase' | 'lowercase' | 'trim' | 'length') {
if (!isString(value)) {
throw new Error('Value must be a string')
}
switch (operation) {
case 'uppercase':
return value.toUpperCase()
case 'lowercase':
return value.toLowerCase()
case 'trim':
return value.trim()
case 'length':
return value.length
default:
throw new Error('Invalid operation')
}
}
console.log(safeStringOperation('hello', 'uppercase')) // 'HELLO'
console.log(safeStringOperation('WORLD', 'lowercase')) // 'world'
console.log(safeStringOperation(' test ', 'trim')) // 'test'
console.log(safeStringOperation('hello', 'length')) // 5
try {
safeStringOperation(123, 'uppercase')
} catch (error) {
console.log(error.message) // 'Value must be a string'
}
配置验证
typescript
import { isString } from 'radash'
function validateConfig(config: any) {
const errors: string[] = []
const requiredStrings = [
{ key: 'apiUrl', minLength: 1 },
{ key: 'databaseUrl', minLength: 10 },
{ key: 'secretKey', minLength: 16 }
]
for (const { key, minLength } of requiredStrings) {
const value = config[key]
if (!isString(value)) {
errors.push(`${key} must be a string`)
} else if (value.length < minLength) {
errors.push(`${key} must be at least ${minLength} characters long`)
}
}
return errors
}
const config = {
apiUrl: 'https://api.example.com',
databaseUrl: 'postgresql://localhost:5432/mydb',
secretKey: 'my-secret-key-123'
}
const errors = validateConfig(config)
console.log(errors) // []
const invalidConfig = {
apiUrl: 123, // 数字
databaseUrl: 'short', // 太短
secretKey: 'key' // 太短
}
const invalidErrors = validateConfig(invalidConfig)
console.log(invalidErrors) // ['apiUrl must be a string', 'databaseUrl must be at least 10 characters long', 'secretKey must be at least 16 characters long']
数据清理
typescript
import { isString } from 'radash'
function cleanStringData(data: any[]) {
return data
.filter(isString)
.filter(str => str.trim() !== '')
.map(str => str.trim())
}
const rawData = ['hello', '', 'world', ' test ', 123, null, 'valid', ' ']
const cleanData = cleanStringData(rawData)
console.log(cleanData) // ['hello', 'world', 'test', 'valid']
类型安全的字符串操作
typescript
import { isString } from 'radash'
function formatUserInput(input: unknown): string {
if (!isString(input)) {
return ''
}
return input
.trim()
.toLowerCase()
.replace(/[^a-z0-9\s]/g, '')
.replace(/\s+/g, ' ')
}
console.log(formatUserInput(' Hello World! ')) // 'hello world'
console.log(formatUserInput('User@123')) // 'user123'
console.log(formatUserInput(123)) // ''
console.log(formatUserInput(null)) // ''
参数验证
typescript
import { isString } from 'radash'
function createUser(name: unknown, email: unknown, bio: unknown) {
if (!isString(name) || name.trim() === '') {
throw new Error('Name must be a non-empty string')
}
if (!isString(email) || !email.includes('@')) {
throw new Error('Email must be a valid string with @ symbol')
}
const userBio = isString(bio) ? bio.trim() : ''
return {
name: name.trim(),
email: email.toLowerCase(),
bio: userBio,
createdAt: new Date()
}
}
try {
const user = createUser('Alice', 'alice@example.com', 'Software developer')
console.log(user) // { name: 'Alice', email: 'alice@example.com', bio: 'Software developer', createdAt: Date }
} catch (error) {
console.log(error.message)
}
try {
createUser('', 'invalid-email', 123) // 无效的输入
} catch (error) {
console.log(error.message) // 'Name must be a non-empty string'
}
模板字符串处理
typescript
import { isString } from 'radash'
function processTemplate(template: unknown, data: Record<string, any>): string {
if (!isString(template)) {
return ''
}
return template.replace(/\{\{(\w+)\}\}/g, (match, key) => {
return data[key] || match
})
}
const template = 'Hello {{name}}, welcome to {{company}}!'
const data = {
name: 'Alice',
company: 'Tech Corp'
}
const result = processTemplate(template, data)
console.log(result) // 'Hello Alice, welcome to Tech Corp!'
const invalidTemplate = 123
const invalidResult = processTemplate(invalidTemplate, data)
console.log(invalidResult) // ''
字符串数组处理
typescript
import { isString } from 'radash'
function processStringArray(values: unknown[]): string[] {
return values
.filter(isString)
.map(str => str.trim())
.filter(str => str !== '')
}
const mixedValues = ['hello', '', 'world', ' test ', 123, null, 'valid', ' ']
const stringArray = processStringArray(mixedValues)
console.log(stringArray) // ['hello', 'world', 'test', 'valid']
注意事项
- 空字符串:
isString('')
返回true
- 空白字符串:
isString(' ')
返回true
- 类型守卫: 这是一个TypeScript类型守卫函数
- 性能: 检查操作很快,适合频繁使用
- 严格检查: 只接受真正的字符串类型
与其他方法的区别
typeof value === 'string'
: 原生检查isString()
: radash提供的字符串检查方法instanceof String
: 检查String对象(不是原始字符串)
实际应用场景
- 表单验证: 验证用户输入的字符串字段
- API处理: 验证API响应中的字符串字段
- 字符串操作: 确保操作的值是字符串类型
- 数据清理: 过滤数组中的字符串
- 配置验证: 验证配置文件中的字符串设置