使用 keyof 的参数通用推断
Parameter Generic Inference With keyof
我正在尝试使用一个函数参数来推断另一个函数参数的缩小泛型类型的键。如果我硬编码一个 class 类型来代替泛型,一切似乎都能正常工作;但是,当使用通用值时,第二个参数的缩小不起作用。现在已经呆了几天了,我迷路了。
迷茫?我知道我是......这是说明问题的代码。在最后一个函数中,第二个参数应该解析为有效的 属性。
class A {
readonly shortname = 'A';
id: number;
genStart: Date;
}
class B {
readonly shortname = 'B';
id: number;
genPart: Date;
}
class C {
readonly shortname = 'C';
id: number;
genEnd: Date;
}
type Entities = A | B | C;
type GetEtType<T extends Entities['shortname']>
= keyof Extract<Entities, { shortname: T }>;
class EtTester {
tester<TShortName extends Entities['shortname'],
TProp extends GetEtType<TShortName>>(shortName: TShortName,
propName: TProp) {
}
}
let et = new EtTester();
et.tester('B', 'genPart' )
任何帮助都会很棒。
如果我正确理解问题,GetEtType<T>
应该 return 实体类型的键 select 由其泛型类型参数 T
编辑,它必须是 shortname
每个实体中定义的值。
keyof Extract<...>
不起作用,似乎 keyof
在解析为 never
.
的条件类型评估中的某个时候急切应用
在 之后,它告诉我们如何 select 一个基于判别式 属性 类型的被判别联合类型的成员,这里是 GetEtType
的定义在这里工作:
type GetEtType<T extends Entities['shortname']>
= Entities extends (infer E)?
E extends Entities?
E['shortname'] extends T ? keyof E : never : never : never
;
我正在尝试使用一个函数参数来推断另一个函数参数的缩小泛型类型的键。如果我硬编码一个 class 类型来代替泛型,一切似乎都能正常工作;但是,当使用通用值时,第二个参数的缩小不起作用。现在已经呆了几天了,我迷路了。
迷茫?我知道我是......这是说明问题的代码。在最后一个函数中,第二个参数应该解析为有效的 属性。
class A {
readonly shortname = 'A';
id: number;
genStart: Date;
}
class B {
readonly shortname = 'B';
id: number;
genPart: Date;
}
class C {
readonly shortname = 'C';
id: number;
genEnd: Date;
}
type Entities = A | B | C;
type GetEtType<T extends Entities['shortname']>
= keyof Extract<Entities, { shortname: T }>;
class EtTester {
tester<TShortName extends Entities['shortname'],
TProp extends GetEtType<TShortName>>(shortName: TShortName,
propName: TProp) {
}
}
let et = new EtTester();
et.tester('B', 'genPart' )
任何帮助都会很棒。
如果我正确理解问题,GetEtType<T>
应该 return 实体类型的键 select 由其泛型类型参数 T
编辑,它必须是 shortname
每个实体中定义的值。
keyof Extract<...>
不起作用,似乎 keyof
在解析为 never
.
在 GetEtType
的定义在这里工作:
type GetEtType<T extends Entities['shortname']>
= Entities extends (infer E)?
E extends Entities?
E['shortname'] extends T ? keyof E : never : never : never
;