依赖于泛型参数作为函数的值参数的类型

大卫·戈麦斯

我有一个通用类型Group看起来像这样:

// K -> Key
// I -> Input
type Group<K, I> = {
    key: K;
    func: (i: I) => void;
};

Group我在这样的对象中声明了固定数量的值:

const GROUPS = {
    "a": {
        func: (i: {x: number}) => { console.log(i); },
        key: "a",
    },
    "b": {
        func: (i: { y: number }) => { console.log(i) },
        key: "b"
    }
} as const;

然后,我有2种实用程序类型来引用所有可能的组键和所有可能的组输入:

type GroupKey = keyof typeof GROUPS;
type GroupInput<K extends GroupKey> = Parameters<typeof GROUPS[K]["func"]>[0];

// GroupValue test:
type TestType = GroupInput<"b">; // { y: number}, this works

最后,我有一个同时接收组密钥和组输入的函数:

function test<K extends GroupKey>(key: K, input: GroupInput<K>) {
    if (key === "b") {
        (input.y); // Why doesn't TypeScript understand that `input.y` must be `number` here?
    }
}

遗憾的是,此函数在传入的密钥类型上是通用的,不幸的是,TypeScript无法“理解”如果keyis "b"input则为type { y: number }为什么会这样,TypeScript缺少什么才能做到这一点?我特别想在此找到一个GitHub问题(以便我可以订阅它),但是我找不到一个,因为这种类型的东西特别难找。

完整的游乐场网址

阿图尔·格泽西亚克

请考虑以下代码段:

const key = 'a' as GroupKey
const input = { y: 1 } // optionally cast as GroupInput<'b'> or as GroupInput<GroupKey>

test(key, input) // compiles, but not intended

input 是独立于key不能保证input.ytest以value'b'作为第一个参数调用时必须有一个数字type TestType = GroupInput<"b">使用文字类型('b')允许Typescript限制'a' | 'b'为just 'b'相同test('b', ...),但类型的传递键'a' | 'b'允许传递类型的输入GroupInput<'a' | 'b'>

一种选择是检查是否'y' in input,但是仍然不能解决不允许错误参数传递的主要问题test通常情况下input as GroupInput<'b'>是不安全的,应不惜一切代价避免

可能的解决方法:

type Params = { [K in GroupKey]: [key: K, input: GroupInput<K>] } // key: and input: are used for auto-completion instead of generic arg_0, arg_1

function test2(...args: Params[GroupKey]) {
    // const [key, input] = args // will not work
    if (args[0] === "b") {
        const input = args[1];
        input.y; // number
    }
}

test2('b', { y: 1 }) // ok
test2('b', { x: 1 }) // error
test2(key, input) // error

操场

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何为依赖于Rust中泛型类型参数的结构的关联函数定义不同的实现?

C#泛型-返回类型依赖于参数的列表。

泛型类型作为构造函数参数

如果仅依赖于其自身的模板参数,该函数类型是否依赖?

使用依赖于lambda函数的类型作为返回类型

如何让Typescript知道依赖于传入参数的函数的返回类型

如何定义依赖于参数包转换的函数的返回类型?

在依赖于模板类型的模板化函数参数中期望嵌套属性

如何使数组的大小依赖于构造函数参数?

依赖于Rust中另一个泛型的泛型类型

泛型类型参数作为参数

Kotlin 泛型类型类作为函数参数

打字稿:枚举泛型类型作为函数的参数

如何使用泛型类型数组和泛型类型类作为构造函数中的参数?

简洁的评估:如何在依赖于%>%管道的自定义函数中使用dplyr :: na_if作为可选参数

处理依赖于参数的动态请求

泛型类型作为接收参数的属性

泛型类型作为委托参数

类型别名如何使用来指定依赖于模板参数的模板模板参数?

函数中的泛型类型参数

具有泛型参数类型的函数

C ++ Koenig(依赖于参数)查找:如果不同名称空间中的两个名称空间函数具有相同的参数类型怎么办?

依赖于其他模板参数的模板参数?

Hyperopt:定义依赖于其他参数的参数

依赖于其他参数的匹配参数的最佳做法

Argparse依赖于其他参数的参数

该参数依赖于不存在的参数

Python 3:依赖于其他函数的函数,缺少参数?

反应:TypeScript泛型,自动从函数切换参数类型(作为道具的函数)