typescript - 提取函数的返回类型并按 typescript 中的属性名称进行过滤

标签 typescript return-type conditional-types

我试图识别具有特定属性名称的函数的返回类型,目的是过滤掉任何不具有此返回属性名称的函数。

为了说明这一点,假设我们有以下函数对象:

export const StorageActions = {
  addFile: () => ({ type: 'ADD_FILE' }),
  deleteFile: () => {
    return () => {
      return null;
    };
  },
};
type StorageActionsTypes = typeof StorageActions;

借助 ReturnType,我可以查看哪个函数的返回属性名称为“type”:

enter image description here

为了验证返回属性名称为“type”的函数,我 执行如下操作:

type filteredActions = { [K in keyof StorageActionsTypes]: 
    keyof ReturnType<StorageActionsTypes[K]> extends ('type') ?  'valid' : 'invalid'};

但结果却出乎意料:

enter image description here

应该是:

interface filteredActions {
  addFile: 'valid';
  deleteFile: 'invalid';
}

我是否错误地使用了“扩展”?实现这一目标的最佳方法是什么?

最佳答案

问题在于您对从不的解释。绝不像 PR 中所述:

never is a subtype of and assignable to every type.

这意味着该类型 type y = 从不扩展 's' ? 'Y' : 'N' 将是 'Y',因为 never's' 的子类型。

这里的简单解决方案是不使用 keyof (对于函数来说,它会返回 never 因此出现上面的问题)

export const StorageActions = {
    addFile: () => ({ type: 'ADD_FILE' }),
    deleteFile: () => {
        return () => {
            return null;
        };
    },
};

type StorageActionsTypes = typeof StorageActions
type filteredActions = {
    [K in keyof StorageActionsTypes]:
        ReturnType<StorageActionsTypes[K]> extends { type: any } ? 'valid' : 'invalid'
}; // now  { addFile: "valid"; deleteFile: "invalid"; }

关于typescript - 提取函数的返回类型并按 typescript 中的属性名称进行过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53854442/

相关文章:

javascript - ES6/ typescript : Stacking map and filter advanced array methods

javascript - Typescript-将属性设置为对象

TypeScript 导入模块在当前范围内不存在

javascript - 什么时候嵌入合适?

c++ - 当函数返回类数据成员时,我如何返回其他东西?

typescript - 根据枚举值有条件地禁止函数参数

TypeScript 查找/条件类型和联合

c# - 为什么 C# 或 C++ 不能根据返回类型区分方法?

c# - 使用非托管导出将字符串从C#返回C++会返回数字

typescript - 条件类型 返回类型 函数签名重载解析