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
