举个例子:
interface Paths {
PathItem1: {
a: string;
b: number;
};
PathItem2: {
c: boolean;
d: number;
};
}
type UrlType<T extends keyof Paths, U extends keyof Paths[T]> = Paths[T][U];
type A = UrlType<'PathItem2', 'c'>; // A -> boolean
type B = UrlType<'PathItem1', 'a'>; // B -> string
当UrlType的第一个泛型,即T传入'PathItem2'的时候, U的约束则为 keyof Paths['PathItem2'], 也就是 'c' | 'd'
Paths[T]则为 Path['PathItem2']
{
c: boolean;
d: number;
};
当第二个泛型传入'c'时 Paths[T] [U]则为 Paths['PathItem2'] ['c'] 也就是boolean
另外我认为这段代码是无意义的代码
T extends keyof Paths ? Paths[T] [U] : any
因为T已经做过了泛型约束, 所以传入的T必然是keyof Paths这个联合类型中的一个值, 如果不是的话,在传入T的时候TS会报错
10 回答11.2k 阅读
6 回答3k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
3 回答5.1k 阅读✓ 已解决
3 回答1.9k 阅读✓ 已解决
这个真的会
泛型中的含义:T 约束为 Paths 的 key,U 约束为 Paths 的值
等号后面:为条件类型。如果 T 的类型为 Paths 的 key,则返回是 Paths 的 key 为 T 的值,的类型
涉及到知识点,类型约束、获取类型的 key 的联合类型、条件类型