@igorskyflyer/common-types
v1.4.0
Published
๐ฆ Provides frequently used types for your TypeScript projects. ๐ฆ
Maintainers
Readme
๐ Table of Contents
- Features
- API
- KeysOf<Type>
- TypeOfValues<Type>
- MethodsOf<Type>
- PropertiesOf<Type>
- DeepPartial<Type>
- Promisable<Type>
- EnumKeys<Type, KeyType>
- Func<Args, FnReturn>
- Callback<Args, FnReturn>
- TrimLeft<Input>
- TrimRight<Input>
- Trim<Input>
- IsGeneric<Type>
- MethodSignature<Type, Method>
- Override<Type, Changes>
- HasOverlap<FirstType, SecondType>
- Extend<Type, Changes>
- MethodName<Type, Method>
- Usage
- API
- Examples
- Changelog
- Support
- License
- Related
- Author
๐ค Features
- ๐ Get all keys of a type with
KeysOf - ๐ฆ Extract all value types from top-level properties via
TypeOfValues - ๐ Identify only method keys using
MethodsOf - ๐งพ Identify only property keys using
PropertiesOf - ๐ฟ Make every property (nested too) optional with
DeepPartial - โณ Accept sync or async values using
Promisable - ๐ฏ Find keys whose values match a specific type via
EnumKeys - ๐ Define generic function signatures with
FuncorCallback - โ Remove leading/trailing whitespace in string types with
TrimLeft,TrimRight,Trim - โ Detect generic types using
IsGeneric - ๐ Get a methodโs exact signature with
MethodSignature - ๐ Override existing keys with new types via
Override - ๐ซ Prevent extending with overlapping keys using
Extend - ๐ Validate a method exists and return its name with
MethodName
๐ต๐ผ Usage
Install it by executing any of the following, depending on your preferred package manager:
pnpm add @igorskyflyer/common-typesyarn add @igorskyflyer/common-typesnpm i @igorskyflyer/common-types๐คน๐ผ API
KeysOf<Type>
Extracts all keys from the type Type.
๐ก TIP
CAN be used with generics as well.
example.ts
type ArrayKeys = KeysOf<Array<string>> // 'at' | 'concat' | 'copyWithin', etc.TypeOfValues<Type>
Extracts all value types of the type Type. Works with top-level properties only.
IPerson.ts
interface IPerson {
firstName: string
lastName: string
zip: number
isMember: boolean
}example.ts
type ValueTypes = TypeOfValues<IPerson> // string | number | booleanMethodsOf<Type>
Extracts all methods from the type Type.
๐ CAUTION
Can NOT be used with generics.
example.ts
type NumberMethods = MethodsOf<Number> // 'toString' | 'toFixed' | 'toExponential' | 'toPrecision' | 'valueOf' | 'toLocaleString'PropertiesOf<Type>
Extracts all properties from the type Type.
๐ CAUTION
Can NOT be used with generics.
example.ts
type StringProperties = PropertiesOf<String> // 'length'DeepPartial<Type>
Constructs a type with all top-level and nested properties of the type Type set to optional.
๐ก TIP
See also TypeScript's built-in utility type
Partial<Type>.
IPerson.ts
interface IPerson {
name: string
address: {
city: string
zip: number
}
}example.ts
type PersonOptional = DeepPartial<IPerson>
/**
* PersonOptional:
* {
* name?: string
* address?: {
* city?: string
* zip?: number
* }
* }
*/Promisable<Type>
Provides a convenient way to allow flexibility in handling values that could either be immediate or asynchronously resolved.
example.ts
const immediateValue: number = 42
const promiseValue: Promisable<number> = Promise.resolve(42)
async function handleValue(value: Promisable<number>) {
const result = await processValue(value)
console.log(result) // Will log the number 42, whether value was a direct number or a Promise resolving to 42
}
handleValue(immediateValue)
handleValue(promiseValue)EnumKeys<Type, KeyType>
Extracts all keys from the Type that are of the type KeyType.
IConfig
interface IConfig {
apiUrl: string
timeout: number
isEnabled: boolean
retryAttempts: number
}example.ts
type ConfigNumbers = EnumKeys<IConfig, number> // 'timeout' | 'retryAttempts'Func<Args, FnReturn>
Constructs a generic Function-like type with the arguments of type Args and the return value of type FnReturn.
example.ts
function process(items: number[], callback: Func<number, boolean>): boolean {
// shortened for brevity
// do NOT access your Array immediately :)
for (let i = 0; i < items.length; i++) {
if (callback(items[i])) {
return true
}
}
return false
}
process([1, 1, 8, 1], (item) => {
if (item % 2 === 0) {
return true
}
return false
}) // returns trueCallback<Args, FnReturn>
Alias of Func<Args, FnReturn>.
TrimLeft<Input>
Recursively removes all leading whitespace from the String type Input.
example.ts
type Id = ' ID'
type ProperId = TrimLeft<Id>
const id: ProperId = ' ID' // ERROR: does NOT accept leading whitespaceTrimRight<Input>
Recursively removes all trailing whitespace from the String type Input.
example.ts
type Id = 'ID '
type ProperId = TrimRight<Id>
const id: ProperId = 'ID ' // ERROR: does NOT accept leading whitespaceTrim<Input>
Recursively removes all leading and trailing whitespace from the String type Input.
example.ts
type Id = ' ID '
type ProperId = Trim<Id>
const id: ProperId = ' ID ' // ERROR: does NOT accept leading nor trailing whitespace๐ก TIP
A very cool usage of the
Trim<Input>type is implemented in themagic-querySelectorproject.
IsGeneric<Type>
Returns a Boolean whether the type Type is a generic.
example.ts
type ArrayIsGeneric = IsGeneric<Array<string>> // true
type NumberIsGeneric = IsGeneric<number> // falseMethodSignature<Type, Method>
Gets the method signature Method of the type Type.
example.ts
type NumberToFixedMethod = MethodSignature<Number, 'toFixed'> // expects (fractionDigits?: number) => stringOverride<Type, Changes>
Overrides the type Type with the new type of Changes.
IPerson
interface IPerson {
name: string
children: boolean
}example.ts
const person: IPerson = {
name:'John Doe',
children: true
}
type NewPerson = Override<IPerson, { children: number }> //only accepts existing keys
const newPerson: NewPerson = {
name:'John Doe',
children: 2
}HasOverlap<FirstType, SecondType>
Checks whether the types FirstType and SecondType overlap, i.e. have the same keys.
โ ๏ธ WARNING
It only checks the key names, NOT their TYPES!
IPerson
interface IPerson {
name: string
children: boolean
}example.ts
type PersonOverlap = HasOverlap<
IPerson,
{
name: string
children: boolean
}
> // returns trueExtend<Type, Changes>
Extends the type Type with the new type of Changes with only non-existent keys in type Type.
IPerson
interface IPerson {
name: string
children: number
}example.ts
type NewPerson = Extend<IPerson, { name: string }> //only accepts non-existing keys
// will return `never` here
const newPerson: NewPerson = {
name: 'John Doe',
children: 2
} // will error
type NewestPerson = Extend<IPerson, { profession: string }> //only accepts non-existing keys
const newestPerson: NewestPerson = {
name: 'John Doe',
children: 2,
profession: 'Developer'
} // will NOT errorMethodName<Type, Method>
Checks for the existence of the method Method in the type of Type and returns it if found.
example.ts
type NumberToFixedMethod = MethodName<Number, 'toFixed'> // toFixed๐๏ธ Examples
utils.ts
import type { Callback } from '@igorskyflyer/common-types'
function process(
items: number[],
callback: Callback<number, boolean>
): boolean {
// shortened for brevity
// do NOT access your Array immediately :)
for (let i = 0; i < items.length; i++) {
if (callback(items[i])) {
return true
}
}
return false
}
const result = process([1, 1, 8, 1], (item) => {
if (item % 2 === 0) {
return true
}
return false
}) // returns true
console.log(result)
๐ Changelog
๐ The changelog is available here, CHANGELOG.md.
๐ชช License
Licensed under the MIT license which is available here, MIT license.
๐ Support
๐งฌ Related
๐ Provides ways of checking whether a path is a legacy Windows device. ๐พ
@igorskyflyer/magic-queryselector
๐ช A TypeScript-types patch for querySelector/querySelectorAll, make them return types you expect them to! ๐ฎ
๐ถ๏ธ Reads a JSON file into a Map. ๐ป
๐งฌ A lightweight JavaScript utility allowing deep copy-by-value of nested objects, arrays and arrays of objects. ๐ช
@igorskyflyer/extendable-string
๐ฆ ExtendableString allows you to create strings on steroids that have custom transformations applied to them, unlike common, plain strings.. ๐ช
๐จ๐ปโ๐ป Author
Created by Igor Dimitrijeviฤ (@igorskyflyer).
