泛型:输入属性名称

时间:2017-10-31 20:55:02

标签: javascript typescript

泛型是否有可能将对象作为用户传递,而不仅仅是类型,而是作为密钥?

interface store {
  category: string
}

interface ajaxResponse<T> {
  data: ajaxData<T>
  errors: string[]
  success: boolean
}

interface ajaxData<T> {
  rewards: {
    amount: number
    error: string
  }
  T: T
}

function get<T>(url): Promise<ajaxResponse<T>> {
    // make ajax GET request
    // return json object
}

let res = await get<store>('/my/url')

res.data.store.category

当我这样做时,它说

  

'ajaxData'

类型中不存在属性'store'

我有办法访问该属性吗?它一旦编译就可以工作了,因为所有这些都被删除了,但是如何让它在编辑器中运行呢?

修改

在考虑之后,我想我不希望界面和属性相同。我想我想使用名为interface的{​​{1}},所以可能是这样的:

x

1 个答案:

答案 0 :(得分:1)

如果您将属性名称作为显式文字类型,则可以使用mapped type syntax声明具有该名称的属性的类型:

integer, dimension(n) :: v

所以完整的例子看起来应该是

type A<T, PropertyName extends string> = {[P in PropertyName]: T}