Skip to content

Instantly share code, notes, and snippets.

@lotus128
Last active October 12, 2023 20:31
Show Gist options
  • Select an option

  • Save lotus128/4ea5e954f1fd1dfad4e9556733e76e7c to your computer and use it in GitHub Desktop.

Select an option

Save lotus128/4ea5e954f1fd1dfad4e9556733e76e7c to your computer and use it in GitHub Desktop.
Lab, TypeScript Mapped Types with Tuples
interface HasGetValue<TValue> {
getValue: () => TValue
}
function transformArray<
TInputs extends Array<HasGetValue<unknown>>,
TOuptuts = { [X in keyof TInputs]: ReturnType<TInputs[X]['getValue']> }
>(
inputs: TInputs
): TOuptuts {
}
function transformReadonlyArray<
TInputs extends ReadonlyArray<HasGetValue<unknown>>,
TOuptuts = { [X in keyof TInputs]: ReturnType<TInputs[X]['getValue']> }
>(
inputs: TInputs
): TOuptuts {
}
function transformConstReadonlyArray<
const TInputs extends ReadonlyArray<HasGetValue<unknown>>,
TOuptuts = { [X in keyof TInputs]: ReturnType<TInputs[X]['getValue']> }
>(
inputs: TInputs
): TOuptuts {
}
function transformReadonlyArrayUsingVariadic<
TValues extends ReadonlyArray<HasGetValue<unknown>>,
TValuesAsTuple extends [...TValues],
TOuptuts = { [X in keyof TValuesAsTuple]: ReturnType<TValuesAsTuple[X]['getValue']> }
>(
inputs: TValues
): TOuptuts {
}
function transformConstReadonlyArrayUsingVariadic<
const TValues extends ReadonlyArray<HasGetValue<unknown>>,
TValuesAsTuple extends [...TValues],
TOuptuts = { [X in keyof TValuesAsTuple]: ReturnType<TValuesAsTuple[X]['getValue']> }
>(
inputs: TValues
): TOuptuts {
}
const inputArray = [
{
getValue: () => true
},
{
getValue: () => 1
},
]
const inputArrayAsConst = [
{
getValue: () => true
},
{
getValue: () => 1
},
] as const
const inputTuple: [HasGetValue<boolean>, HasGetValue<number>] = [
{
getValue: () => true
},
{
getValue: () => 1
},
]
{
// (number | boolean)[]
// incorrect
const a = transformArray(
inputArray
)
// error
const c = transformArray(
inputArrayAsConst
)
// [boolean, | number]
// correct
const b = transformArray(
inputTuple
)
// (number | boolean)[]
// incorrect
const d = transformArray(
[
{
getValue: () => true
},
{
getValue: () => 1
},
]
)
}
{
// (number | boolean)[]
// incorrect
const a = transformReadonlyArray(
inputArray
)
// readonly [boolean, number]
// correct
const c = transformReadonlyArray(
inputArrayAsConst
)
// [boolean, number]
// correct
const b = transformReadonlyArray(
inputTuple
)
// (number | boolean)[]
// incorrect
const d = transformReadonlyArray(
[
{
getValue: () => true
},
{
getValue: () => 1
},
]
)
// [boolean, number]
// correct
const e = transformReadonlyArray(
[
{
getValue: () => true
},
{
getValue: () => 1
},
] as const
)
}
{
// (number | boolean)[]
// incorrect
const a = transformConstReadonlyArray(
inputArray
)
// [boolean, number]
// correct
const c = transformConstReadonlyArray(
inputArrayAsConst
)
// [boolean, number]
// correct
const b = transformConstReadonlyArray(
inputTuple
)
// reaadonly [boolean, number]
// correct
const d = transformConstReadonlyArray(
[
{
getValue: () => true
},
{
getValue: () => 1
},
]
)
}
{
// (number | boolean)[]
// incorrect
const a = transformReadonlyArrayUsingVariadic(
inputArray
)
// [boolean, number]
// correct
const b = transformReadonlyArrayUsingVariadic(
inputArrayAsConst
)
// [boolean, number]
// correct
const c = transformReadonlyArrayUsingVariadic(
inputTuple
)
// (number | boolean)[]
// incorrect
const d = transformReadonlyArrayUsingVariadic(
[
{
getValue: () => true
},
{
getValue: () => 1
},
]
)
// [boolean, number]
// correct
const e = transformReadonlyArrayUsingVariadic(
[
{
getValue: () => true
},
{
getValue: () => 1
},
] as const
)
}
{
// (number | boolean)[]
// incorrect
const a = transformConstReadonlyArrayUsingVariadic(
inputArray
)
// [boolean, number]
// correct
const b = transformConstReadonlyArrayUsingVariadic(
inputArrayAsConst
)
// [boolean, number]
// correct
const c = transformConstReadonlyArrayUsingVariadic(
inputTuple
)
// (number | boolean)[]
// correct
const d = transformConstReadonlyArrayUsingVariadic(
[
{
getValue: () => true
},
{
getValue: () => 1
},
]
)
// [boolean, number]
// correct
const e = transformConstReadonlyArrayUsingVariadic(
[
{
getValue: () => true
},
{
getValue: () => 1
},
] as const
)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment