是否可以添加包装值的通用类型?

时间:2019-07-07 17:38:18

标签: typescript

让我们假设这段代码:

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)

换句话说:我希望能够为data参数指定一个类型,该类型接受类型T,但其所有值都包装在Observables中。因此,我需要一种将T类型(它是一个对象/记录)转换为相同类型并将其所有值都转换为Observable的方法。

还有一个后续问题:是否可以将其扩展到深层嵌套的对象层次结构?

1 个答案:

答案 0 :(得分:1)

您可以使用映射类型将组件属性映射到可观察对象:

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