Wrap Method
The wrap()
method creates a new collection instance from a value or array. It's particularly useful for ensuring that you're working with a collection, regardless of whether your input is a single value or an array.
Basic Syntax
typescript
// Wrap a single value
Collection.wrap(value: U)
// Wrap an array
Collection.wrap(array: U[])
Examples
Basic Usage
typescript
import { collect } from 'ts-collect'
// Wrap a single value
const single = Collection.wrap(1)
console.log(single.all()) // [1]
// Wrap an array
const multiple = Collection.wrap([1, 2, 3])
console.log(multiple.all()) // [1, 2, 3]
// Wrap a string
const string = Collection.wrap('hello')
console.log(string.all()) // ['hello']
Working with Objects
typescript
interface User {
id: number
name: string
}
// Wrap a single object
const user = Collection.wrap<User>({
id: 1,
name: 'John'
})
// Wrap an array of objects
const users = Collection.wrap<User>([
{ id: 1, name: 'John' },
{ id: 2, name: 'Jane' }
])
Real-world Examples
Data Transformer
typescript
interface DataTransformer<T, U> {
transform: (input: T | T[]) => Collection<U>
}
class UserDataTransformer implements DataTransformer<User, any> {
transform(input: User | User[]): Collection<any> {
return Collection.wrap(input).map(user => ({
fullName: user.name,
userId: `USER_${user.id}`,
createdAt: new Date()
}))
}
}
// Usage
const transformer = new UserDataTransformer()
// Transform single user
const singleResult = transformer.transform({
id: 1,
name: 'John'
})
// Transform multiple users
const multipleResults = transformer.transform([
{ id: 1, name: 'John' },
{ id: 2, name: 'Jane' }
])
Request Handler
typescript
interface ApiRequest {
endpoint: string
method: 'GET' | 'POST'
data?: any
}
class RequestProcessor {
processRequest(request: ApiRequest | ApiRequest[]): Collection<ApiRequest> {
return Collection.wrap(request)
.map(req => ({
...req,
timestamp: Date.now(),
processed: true
}))
}
async executeRequests(requests: ApiRequest | ApiRequest[]): Promise<any[]> {
const processedRequests = this.processRequest(requests)
return Promise.all(
processedRequests.map(async (request) => {
// API call simulation
return { status: 'success', data: request }
})
)
}
}
Advanced Usage
Flexible Parameter Handler
typescript
type Parameter = string | number | boolean
interface ParameterHandler<T extends Parameter> {
process: (input: T | T[]) => Collection<string>
}
class QueryParameterHandler implements ParameterHandler<Parameter> {
process(input: Parameter | Parameter[]): Collection<string> {
return Collection.wrap(input)
.map((value) => {
if (typeof value === 'boolean') {
return value ? '1' : '0'
}
return String(value)
})
}
}
// Usage
const handler = new QueryParameterHandler()
console.log(handler.process('test').all()) // ['test']
console.log(handler.process([1, true, 'abc']).all()) // ['1', '1', 'abc']
Configuration Merger
typescript
interface ConfigItem {
key: string
value: any
priority: number
}
class ConfigurationMerger {
merge(baseConfig: ConfigItem | ConfigItem[], override: ConfigItem | ConfigItem[]): Collection<ConfigItem> {
const base = Collection.wrap(baseConfig)
const overrides = Collection.wrap(override)
return base.map((item) => {
const override = overrides.firstWhere('key', item.key)
return override || item
})
}
}
// Usage
const merger = new ConfigurationMerger()
const result = merger.merge(
{ key: 'theme', value: 'light', priority: 1 },
{ key: 'theme', value: 'dark', priority: 2 }
)
Type Safety
typescript
interface TypedItem {
id: number
value: string
metadata?: Record<string, any>
}
// Type-safe wrapping
const single = Collection.wrap<TypedItem>({
id: 1,
value: 'one'
})
const multiple = Collection.wrap<TypedItem>([
{ id: 1, value: 'one' },
{ id: 2, value: 'two' }
])
// TypeScript enforces types
single.each((item) => {
console.log(item.id) // ✓ Valid
console.log(item.value) // ✓ Valid
console.log(item.metadata) // ✓ Valid (optional)
})
Return Value
- Returns a new Collection instance containing:
- Array with single item if given a non-array value
- Array with all items if given an array
- Maintains type safety with TypeScript through generics
- Can be chained with other collection methods
- Original value/array remains unchanged
Common Use Cases
- Normalizing input parameters
- Handling single or multiple items uniformly
- Data transformation pipelines
- API request processing
- Configuration management