diff --git a/.changeset/young-wolves-grow.md b/.changeset/young-wolves-grow.md new file mode 100644 index 0000000000..6d4dd13d15 --- /dev/null +++ b/.changeset/young-wolves-grow.md @@ -0,0 +1,5 @@ +--- +"jspsych": patch +--- + +Improve type definitions for randomization module diff --git a/contributors.md b/contributors.md index 3eae9831f3..4bc62a9749 100644 --- a/contributors.md +++ b/contributors.md @@ -64,4 +64,4 @@ The following people have contributed to the development of jsPsych by writing c * Reto Wyss - https://github.com/retowyss * Shaobin Jiang - https://github.com/Shaobin-Jiang * Haotian Tu - https://github.com/thtTNT - +* Joshua Unrau - https://github.com/joshunrau \ No newline at end of file diff --git a/packages/jspsych/src/modules/randomization.ts b/packages/jspsych/src/modules/randomization.ts index 6343d76205..e58ebaffda 100644 --- a/packages/jspsych/src/modules/randomization.ts +++ b/packages/jspsych/src/modules/randomization.ts @@ -12,7 +12,7 @@ export function setSeed(seed: string = Math.random().toString()) { return seed; } -export function repeat(array, repetitions, unpack = false) { +export function repeat(array: any, repetitions: any, unpack = false) { const arr_isArray = Array.isArray(array); const rep_isArray = Array.isArray(repetitions); @@ -77,7 +77,7 @@ export function repeat(array, repetitions, unpack = false) { return out; } -export function shuffle(array: Array) { +export function shuffle(array: Array) { if (!Array.isArray(array)) { console.error("Argument to shuffle() must be an array."); } @@ -101,7 +101,7 @@ export function shuffle(array: Array) { return copy_array; } -export function shuffleNoRepeats(arr: Array, equalityTest: (a: any, b: any) => boolean) { +export function shuffleNoRepeats(arr: Array, equalityTest: (a: T, b: T) => boolean) { if (!Array.isArray(arr)) { console.error("First argument to shuffleNoRepeats() must be an array."); } @@ -143,7 +143,10 @@ export function shuffleNoRepeats(arr: Array, equalityTest: (a: any, b: any) return random_shuffle; } -export function shuffleAlternateGroups(arr_groups, random_group_order = false) { +export function shuffleAlternateGroups( + arr_groups: Array, + random_group_order = false +) { const n_groups = arr_groups.length; if (n_groups == 1) { console.warn( @@ -178,7 +181,7 @@ export function shuffleAlternateGroups(arr_groups, random_group_order = false) { return out; } -export function sampleWithoutReplacement(arr, size) { +export function sampleWithoutReplacement(arr: Array, size: number) { if (!Array.isArray(arr)) { console.error("First argument to sampleWithoutReplacement() must be an array"); } @@ -189,7 +192,7 @@ export function sampleWithoutReplacement(arr, size) { return shuffle(arr).slice(0, size); } -export function sampleWithReplacement(arr, size, weights?) { +export function sampleWithReplacement(arr: Array, size: number, weights?: number[]) { if (!Array.isArray(arr)) { console.error("First argument to sampleWithReplacement() must be an array"); } @@ -301,6 +304,21 @@ export function sampleExGaussian( return s; } +type RandomWordsOptions = { + min?: number; + max?: number; + exactly?: number; + maxLength?: number; + wordsPerString?: number; + seperator?: string; + formatter?: (word: string, index: number) => string; + join?: string; +}; + +type RandomWordsResult = T extends { join: string } + ? string + : string[]; + /** * Generate one or more random words. * @@ -311,8 +329,9 @@ export function sampleExGaussian( * * @returns An array of words or a single string, depending on parameter choices. */ -export function randomWords(opts) { - return rw(opts); +export function randomWords(opts: T) { + // there is a type incompatibility here because `random-words` uses overloads rather than generics + return rw(opts) as RandomWordsResult; } // Box-Muller transformation for a random sample from normal distribution with mean = 0, std = 1 @@ -325,8 +344,8 @@ function randn_bm() { return Math.sqrt(-2.0 * Math.log(u)) * Math.cos(2.0 * Math.PI * v); } -function unpackArray(array) { - const out = {}; +function unpackArray(array: object[]) { + const out: Record = {}; for (const x of array) { for (const key of Object.keys(x)) {