typescript - Je li moguće dodati generički tip koji omotava vrijednosti?


Pretpostavimo ovaj kod:

interface PersonData {
  name: string
  age: number
}

class Component<T> {}

class PersonComponent extends Component<PersonData> {}

function foo<T>(component: Component<T>, data: any) {
  // How to specify the correct type for `data` when passing observables as shown below?
}

const personData = { name: Observable.of('John'), age: Observable.of(35) }

foo(new PersonComponent, personData)

Drugim riječima: želim moći odrediti tip za parametar data koji prihvaća tip T, ali sve njegove vrijednosti umotane u Observables. Dakle, trebam način da generički pretvorim tip T (koji je objekt/zapis), u isti tip sa svim njegovim vrijednostima pretvorenim u Observables.

I još jedno pitanje: bi li bilo moguće proširiti to na duboko ugniježđene hijerarhije objekata?

Odgovor #1

Možete koristiti tip mapiranja za mapiranje svojstava komponente na observables:

interface PersonData {
  name: string
  age: number
}

class Component<T> { p!: T}

class PersonComponent extends Component<PersonData> {}

type ObservableRecord<T> = {
    [P in keyof T]: Observable<T[P]>
}
function foo<T>(component: Component<T>, data: ObservableRecord<T>) {
}

const personData = { name: Observable.of('John'), age: Observable.of(35) }    
foo(new PersonComponent, personData) 


const personDataErr = { name: Observable.of('John'), age: Observable.of("35") }    
foo(new PersonComponent, personDataErr) // err