gpt4 book ai didi

TypeScript 参数类型推断失败

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

我创建了一个 bug report为此,但也许有人有解决方法的想法。基本上我想根据另一个函数的类型有条件地为函数提供一些参数:

declare function foo<P>(params: { f: (p: P) => void } & P): void;

foo({
f(params: { bar(x: number): void }) {},
bar(x) {},
});

所以有一个特殊的参数f,它有一个函数类型,函数需要的任何属性都必须作为参数包含在foo中。这里再次将 bar 的参数推断为 any 但应该是 number

最佳答案

每当我看到函数类型依赖于参数值的要求时,“使用重载”是第一个想到的:

declare function foo(params: { tag: 'a', bar(x: number): void }): void;
declare function foo(params: { tag: 'b', bar(x: boolean): void }): void;

foo({ tag: 'a', bar(x) { console.log('x =', x)} }); // (parameter) x: number

更新 我假设在下面的代码中 foof 是 React 组件,并且 foo 公开了 f 作为其属性,以及 f 具有的所有属性。

declare function foo<P>(params: { f: (p: P) => void } & P): void;

foo({
f(params: { bar(x: number): void }) {},
bar(x) {},
});

有一种方法可以重写它,如果你不坚持 f 的名称(它是 foo 的属性),以及类型f 属性在调用时必须在 foo 参数内内联声明。

您可以声明一个描述此类组合组件属性的类型,它有两个通用参数:内部组件属性的类型和外部属性中的内部组件名称:

type ComposedProps<InnerProps, N extends string> = 
InnerProps & { [n in N]: (props: InnerProps) => void };

// Also I assume in reality it does not return `void` but `React.Element`,
// but I don't think it matters

declare function foo<P>(params: P): void;

// foo generic parameter is given explicitly,
// which allows to infer (and not repeat) parameter types for `f` and `bar`
foo<ComposedProps<{bar(x: number): void}, 'f'>>({
f(params) {}, // params: { bar(x: number): void; }
bar(x) {}, // (parameter) x: number
});

关于TypeScript 参数类型推断失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51183228/

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