class A {}
class B {}
class C {}
class D {}
//! How/Why does that even work?
type MyObjectType<T extends (keyof Hash), Hash> = (keyof Hash) extends T ? null : Hash[T];
class Example {
public static ClassesByName = { A: A, B: B, C: C, D: D };
public stringToClass<
Hash extends typeof Example.ClassesByName,
T extends keyof Hash,
>(className: T): MyObjectType<T, Hash> {
throw new Error("unimplemented");
}
}
const instance = new Example();
const klassA = instance.stringToClass("A"); //<- Expected: klassA is "typeof A" as wanted
const klassB = instance.stringToClass("B"); //<- Expected: klassB is "typeof B" as wanted
const klassZ = instance.stringToClass("Z"); //<- Expected: klassZ is null, wrong parameter triggers ts error as wanted
看起来我的条件类型与文档相反
Typescript 的documentation for conditional types个国家:
SomeType extends OtherType ? TrueType : FalseType;
因此,我的逻辑是:如果Hash
中的键包括key(T
),则Hash[T]
中包含键(T
);否则为null
;因此我写道:
type MyObjectType<T extends (keyof Hash), Hash> = (keyof Hash) extends T ? Hash[T] : null;
但这并没有用词,颠倒TrueType : FalseType
个字让它完美地工作:
type MyObjectType<T extends (keyof Hash), Hash> = (keyof Hash) extends T ? null : Hash[T];
为什么它会起到相反的作用?