gpt4 book ai didi

typescript - 为什么 typescript 不能在这里为类型参数 `T[key of T]` 推断出 `T` 的类型?

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

我正在尝试编写一个通用类,它传递一个键 key 对应于一组已知接口(interface)中的一个的键,稍后可以传递一个对象 thing 并类型安全地访问 thing[key]。这是我得到的:

interface AB {
a: string
b: number
}

interface BC {
b: number
c: Date
}

type ABC = AB | BC

class Getter<T extends ABC> {
key: keyof T;

constructor(key: keyof T) {
this.key = key;
}

get(thing: T): string {
const value = thing[this.key];
return value.toString();
}

}

const getter = new Getter<AB>('b');

Playground Link

在这里,我希望 Typescript 推断出因为 T extends ABC T[keyof T] = AB[keyof AB] | BC [BC 键] = 字符串 |编号 |日期。但是,它似乎卡在 T[keyof T] 处。甚至添加 as AB[keyof AB] | BC[keyof BC] 到那一行并没有解决它,我需要 as unknown as AB[keyof AB] | BC[BC 键]!有没有办法在没有那条线的情况下让它工作?

此外,有什么方法可以将 key 的值参数化为一种类型,而不是参数化 thing 的类型?

最佳答案

T extends ABC 时,它可以有许多其他属性和类型。因此不能有 .toString() 方法。

type G = {
a: string;
b: number;
hello: undefined;
};

const g = new Getter<G, keyof G>("hello");

g.get({
a: "a",
b: 1,
hello: undefined
}); // undefined does not have .toString() method

Playground Link

关于typescript - 为什么 typescript 不能在这里为类型参数 `T[key of T]` 推断出 `T` 的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72567518/

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