Typescript 在下游接口上保留基于字段内容的联合类型识别

Typescript 在下游接口上保留基于字段内容的联合类型识别,typescript,Typescript,下面是一个场景 我有一个接口,表示通用字段(假设我们讨论的是来自Angular Material的MatFormField实例)的元数据,它包含一个名称和一个类型,这是一个常见输入类型的列表 export type FieldType='string'|'number'|'date'|'datetime'|'select'; 导出接口字段元数据{ 只读类型:字段类型; 名称:字符串; } 一些字段s只需要这些元数据就可以了,而另一些则需要额外的信息,因此需要接口扩展。 然后我定义了一个联合类型

下面是一个场景

我有一个接口,表示通用
字段
(假设我们讨论的是来自Angular Material的
MatFormField
实例)的元数据,它包含一个名称和一个类型,这是一个常见输入类型的列表

export type FieldType='string'|'number'|'date'|'datetime'|'select';
导出接口字段元数据{
只读类型:字段类型;
名称:字符串;
}
一些
字段
s只需要这些元数据就可以了,而另一些则需要额外的信息,因此需要接口扩展。 然后我定义了一个联合类型,以便根据“type”字段获得正确的类型提示

//选择字段的特定接口
导出接口SelectFieldInterface扩展了FieldMetadata{
只读类型:“选择”;
选项:字符串[];
}
//不需要其他信息的所有其他字段
导出接口GenericFieldInterface扩展了FieldMetadata{
只读类型:排除;
}
导出类型字段=GenericFieldInterface |选择FieldInterface;
//了解这是一个通用的现场接口
常量genericField1:字段={
键入:“编号”,
名称:“”
};
常量genericField2:字段={
键入:“编号”,
名称:“”,

选项:[]/解决问题的最简单方法是使用类型别名和交叉点,添加所需的额外属性。只要这些类型仅用于类型检查对象文字,而不必由类实现,就可以正常工作:

type Model = Field & {
    additionalProperty: string;
}
const genericField: Model = {
  type: 'number',
  name: '',
  additionalProperty: '',
  option: [] // err
};

const selectField: Model = { //err
  type: 'select',
  name: '',
  additionalProperty: '',
};

我不认为这是一个打字脚本问题-实体原则应该有助于设计类型层次结构。对我来说,似乎我很好地遵循了实体原则,这个问题本身就是一个强制执行实体L部分的帮助请求。但是如果你有一些更具体的评论/建议,我很高兴听到:)这么简单,但我从来没有想过真是太好了,好心的先生,它很有魅力。