对于给定的对象,例如:
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;
}
关于如何进行这项工作的任何想法?
答案 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 }
]
}
答案 1 :(得分:0)
使用类型代替接口:
type State<T> = { [P in keyof T]: boolean };