gpt4 book ai didi

TypeScript:如何根据另一个泛型推断一个泛型的类型?

转载 作者:行者123 更新时间:2023-12-02 18:52:26 25 4
gpt4 key购买 nike

我有这个代码:

class A<T> {
a(t: T) {
console.log(t);
}
}

class B<T, O extends {b: T}> {
constructor(public a: A<O>) {
}

b(t: T) {
console.log(t)
}
}

const a = new A<{b: number}>(); // type: A<{ b: number; }>

const b = new B(a); // type: B<unknown, { b: number; }>

为什么 TypeScript 将类 B 的方法 b 的参数标记为未知?

最佳答案

我们有 TO 类型,其中 O extends {b: T}TO['b']的关系是O['b'] extends T。这意味着 T 可以是 O['b'],但也可以是任何更广泛O['b']

typescript 不可能推断出这种推理方向,因为 T 有无限多种类型,使得 number extends T。正如 @md2perpe 所建议的,您可以使用非常广泛的类型,例如 any{}。你可以有一个包含 number 的联合,比如 string |编号

为了能够推断出第二个参数,我们需要 extends 去另一条路。我们需要知道 T 必须比 O['b']。我们可以这样写:

class B<T extends O['b'], O extends {b: any}> {

这里我们说 O 是一些具有 b 属性的对象。我们说 T 是某种类型,它是 Ob 值或其子集。现在 typescript 会将 T 推断为 O['b']

const a = new A<{b: number}>(); // type: A< b: number; }>

const b = new B(a); // type: B<number, { b: number; }>

b.b(5) // takes type: number

请注意,您仍然可以手动将 T 设置为更窄的类型:

const specificB = new B<5, {b: number}>(a); // type: B<5, { b: number; }>

specificB.b(10); // error: Argument of type '10' is not assignable to parameter of type '5'.

Typescript Playground Link

关于TypeScript:如何根据另一个泛型推断一个泛型的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66586780/

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