基于打字稿中现有的动态类型

时间:2019-04-24 10:49:56

标签: typescript

对于给定的对象,例如:

class Product {
  constructor(
    public metadata: Metadata,
    public topic: Topic,
    public title = 'empty'
  ) {}
  ...
}

我要创建一个界面:

interface State<T> {
}

使得TypeScript确保product: State<Product>具有与Product相同的结构,但其匹配的叶子级属性为布尔值。因此,product应该具有boolean类型的title属性。


我看了mapped-types上的只读示例,但在这种情况下,我可能需要复合:

interface State<T> {
  [p in keyof T]: typeof T[p] === 'object' ? State<T[p]> : boolean;
}

关于如何进行这项工作的任何想法?

2 个答案:

答案 0 :(得分:3)

您已经关闭,语法已关闭,需要使用type而不是interface,并且typeof T[p] === 'object'的写法是T[p] extends object

class Metadata {
  constructor(
    public key = 'empty',
    public value = 'empty'
  ) { }
}
class Topic {
  constructor(
    public name = 'empty'
  ) { }
}
class Product {
  constructor(
    public metadata: Metadata[],
    public topic: Topic,
    public title = 'empty'
  ) { }

}

type State<T> = {
  [P in keyof T]: T[P] extends object ? State<T[P]> : boolean
}
let o: State<Product> = {
  title: true,
  topic: {
    name: true
  },
  metadata: [
    { key: true, value: false }
  ]
}

Playground link

答案 1 :(得分:0)

使用类型代替接口:

type State<T> = { [P in keyof T]: boolean };