Typescript 替代接口类型,但使用嵌套对象保留形状

Typescript 替代接口类型,但使用嵌套对象保留形状,typescript,typescript-typings,Typescript,Typescript Typings,我有一个接口,用于定义NoSQL文档模式的形状。它包含字符串、数组、嵌套对象等。例如,我有如下内容: 接口IStudentSchema{ 名称:字符串; 年龄:弦; 傅:{ a:数字; b:[数字,数字]; c:字符串; } } 我想创建另一个保持相同形状的接口,但是每个值的类型都要被某个接口替换(类型为object时除外),例如,我想要下面这样的东西。请注意,它还保留原始类型,并将其用作泛型 接口是udentSchemaFieldInfo{ 名称:ISchemaField; 年龄:ISche

我有一个接口,用于定义NoSQL文档模式的形状。它包含字符串、数组、嵌套对象等。例如,我有如下内容:

接口IStudentSchema{
名称:字符串;
年龄:弦;
傅:{
a:数字;
b:[数字,数字];
c:字符串;
}
}
我想创建另一个保持相同形状的接口,但是每个值的类型都要被某个接口替换(类型为object时除外),例如,我想要下面这样的东西。请注意,它还保留原始类型,并将其用作泛型

接口是udentSchemaFieldInfo{
名称:ISchemaField;
年龄:ISchemaField;
傅:{
a:伊斯切马菲尔德;
b:ISchemaField;
c:ISchemaField;
}
}
有没有办法在修改原始模式接口时得到编译时警告?到目前为止,我不得不手动保持它们的同步


通过使用
Record
,我几乎可以做到这一点,因为没有嵌套对象,但这仍然无法为
ISchemaField
接口指定泛型。有什么想法吗?

如果我正确理解了这个问题,您可以通过扩展子接口来实现这一点。顺便说一下,我翻转了定义,模式有
ISchemaField
定义

接口MysqlObject{ 方法():布尔; } 类型ISchemaField=T | MysqlObject; 接口IStudentSchema{ 名称:ISchemaField; 年龄:ISchemaField; 傅:{ a:伊斯切马菲尔德; b:ISchemaField; c:ISchemaField; } } 接口IStudent扩展了IStudentSchema{ 名称:字符串; 年龄:弦; 傅:{ a:数字; b:[数字,数字]; c:字符串; } } 这将保持基本接口的形状,如果更改,将抛出编译时错误


如果我正确理解了这个问题,您可以通过扩展子接口来实现这一点。顺便说一下,我翻转了定义,模式有
ISchemaField
定义

接口MysqlObject{ 方法():布尔; } 类型ISchemaField=T | MysqlObject; 接口IStudentSchema{ 名称:ISchemaField; 年龄:ISchemaField; 傅:{ a:伊斯切马菲尔德; b:ISchemaField; c:ISchemaField; } } 接口IStudent扩展了IStudentSchema{ 名称:字符串; 年龄:弦; 傅:{ a:数字; b:[数字,数字]; c:字符串; } } 这将保持基本接口的形状,如果更改,将抛出编译时错误


如果我从IStudentSchema或StudentSchema中添加或删除字段,则此操作无效,因为我没有收到任何警告,并且编译良好。它们必须保持同步。@CookieMonster您所要求的是类型检查必须以两种方式进行。这意味着这两种类型相互依赖,这是循环引用,在typescript中是不允许的。理想的解决方案是泛型或高阶类型,但这种语言尚未实现。有关详细信息,请参阅此github问题。如果我从IStudentSchema或StudentSchema中添加或删除字段,则此操作不起作用,因为我没有收到任何警告,并且它可以正常编译。它们必须保持同步。@CookieMonster您所要求的是类型检查必须以两种方式进行。这意味着这两种类型相互依赖,这是循环引用,在typescript中是不允许的。理想的解决方案是泛型或高阶类型,但这种语言尚未实现。有关详细信息,请参阅此github问题