gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 21:34:28 25 4
gpt4 key购买 nike

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

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

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

在 ReturnType 的帮助下,我可以看到哪个函数确实具有“类型”的返回属性名称:

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';
}

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

最佳答案

问题在于您对never 的解释。从来没有像PR中描述的那样:

never is a subtype of and assignable to every type.

这意味着这种类型 type y = never extends '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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com