typescript - 使用条件接口正确输入高阶函数返回函数
问题描述
如何正确键入以下函数?
type
提供参数,返回requiredDpFields | null
type
未提供参数,返回requiredDpFieldsGroup | null
type ProfileTypeValues = 'personal' | 'company';
interface RequiredDpFields {
require?: string[];
requireOneOf?: string[][];
}
interface RequiredDpFieldsGroup {
personal?: RequiredDpFields;
company?: RequiredDpFields;
}
interface AppState {
requiredDpFields?: Record<string, RequiredDpFieldsGroup>;
}
interface RequiredFieldsFn {
(type: ProfileTypeValues, profileCountry?: string): RequiredDpFields | null;
(type: undefined | null, profileCountry?: string): RequiredDpFieldsGroup | null;
};
function requiredDpFieldsHash(tld: string[], profileCountry?: string) {
return tld.join(':') + ( profileCountry ? ':(' + profileCountry + ')' : '');
}
function requiredFields(state: AppState, getters: any): RequiredFieldsFn {
const fn: RequiredFieldsFn = (type: ProfileTypeValues | undefined | null, profileCountry?: string) => {
if (!state.requiredDpFields) {
return null;
}
const hash = requiredDpFieldsHash(getters.tlds, profileCountry);
const requiredDpFields = state.requiredDpFields[hash];
if (!requiredDpFields) {
return null;
}
return type ? requiredDpFields[type] || null : requiredDpFields;
};
return fn;
}
TS 抛出错误const fn: ...
Type '(type: ProfileTypeValues | undefined | null, profileCountry?: string | undefined) => RequiredDpFields | RequiredDpFieldsGroup | null' is not assignable to type 'RequiredFieldsFn'.
Type 'RequiredDpFields | RequiredDpFieldsGroup | null' is not assignable to type 'RequiredDpFields | null'.
Type 'RequiredDpFieldsGroup' has no properties in common with type 'RequiredDpFields'.
编辑 1
尝试重载
问题:
- 因为我需要高阶函数的上下文,所以我把它放在里面,现在如何引用高阶函数的返回值?
- 抛出错误
This overload signature is not compatible with its implementation signature.
Type '(type: ProfileTypeValues, profileCountry?: string | undefined) => RequiredDpFields | null' is not assignable to type 'RequiredFieldsFn'.
Types of parameters 'type' and 'type' are incompatible.
Type 'null | undefined' is not assignable to type 'ProfileTypeValues'.
Type 'undefined' is not assignable to type 'ProfileTypeValues'.
type ProfileTypeValues = 'personal' | 'company';
interface RequiredDpFields {
require?: string[];
requireOneOf?: string[][];
}
interface RequiredDpFieldsGroup {
personal?: RequiredDpFields;
company?: RequiredDpFields;
}
interface AppState {
requiredDpFields?: Record<string, RequiredDpFieldsGroup>;
}
interface RequiredFieldsFn {
(type: ProfileTypeValues, profileCountry?: string): RequiredDpFields | null;
(type: undefined | null, profileCountry?: string): RequiredDpFieldsGroup | null;
};
function requiredDpFieldsHash(tld: string[], profileCountry?: string) {
return tld.join(':') + ( profileCountry ? ':(' + profileCountry + ')' : '');
}
function requiredFields(state: AppState, getters: any): RequiredFieldsFn {
function requiredFieldsFn(type: ProfileTypeValues, profileCountry?: string): RequiredDpFields | null;
function requiredFieldsFn(type: undefined | null, profileCountry?: string): RequiredDpFieldsGroup | null {
if (!state.requiredDpFields) {
return null;
}
const hash = requiredDpFieldsHash(getters.tlds, profileCountry);
const requiredDpFields = state.requiredDpFields[hash];
if (!requiredDpFields) {
return null;
}
return type ? requiredDpFields[type] || null : requiredDpFields;
}
return requiredFieldsFn;
}
编辑 2
解决方案
推荐阅读
- openstack - JQ 交叉引用或如何用输入的另一部分替换一个值
- ios - 当 TableView 单元格向上滚动时,不会从父 tableView 调用子集合视图委托方法
- php - 为什么我不能在 php 中添加超过 7400 天的日期?
- android - Android Wear Recycler 视图效果
- node.js - 如何在事件函数中调用超级构造函数
- python - 熊猫数据框:字符串值的计数在特定ID的行中
- cordova - 离子页面只需要从http请求中加载一次数据
- r - 对有限制的行进行分组连接
- plc - plc的扫描周期和while(1){ ... }交出的代码有什么区别?
- php - 为什么`substr([], 1)` 不返回“ray”?