typescript - 打字稿将“父键”推断为类型
问题描述
如何将父级的键推断为嵌套属性的类型?
interface List {
[key:string]: Definition<keyof List>
}
interface Definition<T> {
[key:string]: Field<T>
}
type Field<T> = FieldA | FieldB<T>;
interface FieldA {
type: string
}
interface FieldB<T> {
definition: T
}
const list:List = {
def1: {
field1: {
type: 'a'
}
},
def2: {
definition: 'def1'
// ~~~ Type 'string' is not assignable to type 'Field<never>'.
}
}
这里的definition
属性类型是never
。我想成为def1 | def2
。
或者更一般地获取父对象的键并将其用作类型。
更简单的版本
interface List {
[key:string]:keyof List
}
const list:List = {
def1: 'def2',
// ~~~ Type 'string' is not assignable to type 'never'.
def2: 'def1'
// ~~~ Type 'string' is not assignable to type 'never'.
}
为什么keyof List
是类型never
?考虑到我事先不知道钥匙,我怎么能拿到钥匙。
解决方案
这行得通,虽然它很丑;)
type List<K extends keyof any> = { [key in K]: K };
const list = new class C implements List<keyof C> {
def1: 'def2'
def2: 'def1'
def5: 'def5'
}
这有点不那么难看,而且也有效;)
type List<T extends object> = { [key in keyof T]: keyof T }
const List = <O extends object>(o: List<O>): List<O> => o;
const list = List({
def1: 'def2',
def2: 'def1',
def5: 'def5'
});
推荐阅读
- scala - Future[Source] pipeTo an Actor
- c# - 获取运行Ubuntu子系统的Windows公共路径
- python - 如何避免函数名称中的参数类型?
- python - spaCy:下载英文模型时出错
- jinja2 - 用 saltstack 将谷物从列表中检查出来
- javascript - 在拖放中交换内容
- swift - 当在 UITableViewController 上模态显示 UIPageViewController 时,导航栏和工具栏上的图形伪影
- webgl - WebGL 2.0 兼容性?
- symfony - 如何在 symfony 3 中设置时区?
- spring - Atomikos 使用 UserTransactionServiceImp 配置 UserTransactionImp