有没有办法判断TypeScript中是否不需要接口属性

有没有办法判断TypeScript中是否不需要接口属性,typescript,interface,Typescript,Interface,有没有办法区分在运行时是否需要接口属性? 假设我们有: export interface IPagination { mode: PaginationMode; pageSizes: number[]; defaultPageSize?: number; } 现在在运行时,我需要从某个JSON文件中读取一个配置,将其保存到IPagination类型的某个属性中,并希望使用接口元数据检查配置的有效性(在我的例子中,如果我有两个配置,一个带有defaultPageSize,

有没有办法区分在运行时是否需要接口属性? 假设我们有:

export interface IPagination {
    mode: PaginationMode;
    pageSizes: number[];
    defaultPageSize?: number;
}
现在在运行时,我需要从某个JSON文件中读取一个配置,将其保存到IPagination类型的某个属性中,并希望使用接口元数据检查配置的有效性(在我的例子中,如果我有两个配置,一个带有defaultPageSize,另一个没有,它们都是有效的)。
使用接口信息可以做到这一点吗?

在这种情况下,我将使用两种不同的类型,并使用类型保护来区分它们

导出类型分页={
模式:分页模式;
页面大小:数字[];
};
导出类型分页WithDefaultPageSize=分页&{
defaultPageSize:数字;
};
//显示如何使用typeguard的示例函数:
函数检查分页(配置:分页|使用DefaultPageSize分页){
hasDefaultPageSize(配置)
?console.log(`默认页面大小为${config.defaultPageSize}`);
:console.log('这是正常的分页配置,没有默认的页面大小');
}
//这是typeguard:
函数hasDefaultPageSize(配置:Pagination | PaginationWithDefaultPageSize):配置是PaginationWithDefaultPageSize{
在配置中返回“defaultPageSize”;
}
使用typeguard,TypeScript将知道
config
的类型是
Pagination
PaginationWithDefaultPageSize
,您可以访问这两种类型的不同属性

更新:

如果您只想验证对象是否正常并包含所有必需的键,那么使用TypeScript是不可能的。TypeScript是一个传输程序,而不是验证程序

我还是会写一个这样的打字机:

函数isValidPaginationConfig(配置:任意|分页):配置是分页{
在配置中返回'mode'
&&配置中的“页面大小”
&&isArray(config.pageSizes);
}

类型系统正在传输中,因此在运行时没有元数据可供使用。对于像
IPagination
这样的单个接口,您可以手动编写一个脚本来执行已解析JSON的验证。你需要帮忙吗?(请注意,我们不知道什么是
PaginationMode
)如果缺少defaultPageSize(这是可选的),这很酷,但是如果配置缺少,比如PageSize,该怎么办?我怎么知道它是无效的。如果可能的话,不用硬编码,只使用接口元数据?