gpt4 book ai didi

如果将泛型用作回调的参数,则 TypeScript 泛型的类型推断会失败

转载 作者:行者123 更新时间:2023-12-05 05:33:46 25 4
gpt4 key购买 nike

这编译得很好:

class Foo<F> {
bar: Array<F> = [];

static create<F, T extends Foo<F>>(this: new () => T): T {
return new this();
}
}

class Foo2 extends Foo<string> {}

const foo = Foo2.create();

但如果我转换 Array<F>Array<(a: F) => void> ,同样的代码失败了:

class Foo<F> {
bar: Array<(a: F) => void> = [];

static create<F, T extends Foo<F>>(this: new () => T): T {
return new this();
}
}

class Foo2 extends Foo<string> {}

const foo = Foo2.create();
^^^
The 'this' context of type 'typeof Foo2' is not assignable to method's 'this' of type 'new () => Foo<unknown>'.
Types of construct signatures are incompatible.
Type 'new () => Foo2' is not assignable to type 'new () => Foo<unknown>'.
Type 'Foo2' is not assignable to type 'Foo<unknown>'.
Type 'unknown' is not assignable to type 'string'. ts(2684)

如果我手动输入它,它会起作用:

const foo = Foo2.create<string, Foo2>();

所以出于某种原因,TypeScript 无法推断出 string type 如果它在函数参数中使用。这是为什么?

最佳答案

我不确定为什么 TypeScript 没有弄清楚类型,但我认为你犯了一些错误,但无论如何你都没有犯错,尤其是方法声明中的 F 类型覆盖了 F 在类本身中。

您的代码可以简化如下:

class Foo<F> {
bar: Array<(a: F) => void> = [];

static create<T>(this: new () => T) {
return new this();
}
}

class Foo2 extends Foo<string> {}


const foo = Foo2.create();

它会正常工作:

Playground Link

更新:抱歉,我最初看错了问题。答案已经更新。

关于如果将泛型用作回调的参数,则 TypeScript 泛型的类型推断会失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73770110/

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