首页 > 解决方案 > 使用条件接口正确输入高阶函数返回函数

问题描述

如何正确键入以下函数?

  1. type提供参数,返回requiredDpFields | null
  2. 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

尝试重载

问题:

  1. 因为我需要高阶函数的上下文,所以我把它放在里面,现在如何引用高阶函数的返回值?
  2. 抛出错误
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

再生产

繁殖超载

标签: typescripttypescript-typings

解决方案


推荐阅读