tengo este codigo:
interface Process<T> { first: () => T[]; second: (d: T) => void; } const PROCESSES: Process<T>[] = [ { first: () => [{car: "car1"}], second: (car: {car: string}) => {}, }, { first: () => [{person: "person1"}], second: (person: {car: string}) => {}, // => How to make TS mark this as an error because is not a persona type? }, ]; El problema es que TypeScript arroja este error: Cannot find name 'T'.
Utiliza el nombre genérico T cuando define la interfaz o el tipo. No puede usarlo para declarar tipos de variables. Debe crear un tipo/interfaz para Car y Person y usarlos en la declaración de PROCESSES en lugar de T .
interface Process<T> { first: () => T[]; second: (d: T) => void; } type Car = { car: string }; type Person = { person: string }; const PROCESSES: (Process<Car> | Process<Person>)[] = [ { first: () => [{ car: 'car1' }], second: (car: Car) => {}, // => works }, { first: () => [{ person: 'person1' }], second: (person: Person) => {}, // => works }, { first: () => [{ person: 'person1' }], second: (person: Car) => {}, // => Error! ];Si no desea especificar manualmente todos los tipos de elementos en la matriz de processes , puede usar una función de fábrica como esta:
function createProcesses< T extends any[] >(process: [...{ [I in keyof T]: { first: () => T[I][], second: (d: T[I]) => void } } ]){ return process } const processes = createProcesses([ { first: () => [{ car: 'car1' }], second: (car: Car) => {}, // => works }, { first: () => [{ person: 'person1' }], second: (person: Person) => {}, // => works }, { first: () => [{ person: 'person1' }], second: (person: Car) => {}, // => Error! } ])