I have created a generic type helper called DataType
, which accepts a parameter T that is constrained to the keyof MyObject
type. If the key is present in MyObject
,DataType
will return the property type of MyObject
; otherwise, it will return T itself.
interface MyObject {
foo: string;
bar: boolean;
}
export type DataType<T extends keyof MyObject> = T extends keyof MyObject
? MyObject[T]
: T;
Now if I pass any key of MyObject
, it will return the corresponding type:
type StrType=DataType<'foo'>; // data type is string
But if I pass a data type other than a string to this helper, I am getting Type 'type' does not satisfy the constraint '"foo"'
:
type numType=DataType<number>;
How to not constrain the type but still have IntelliSense prompt for the key of MyObject
?
CodePudding user response:
You really don't want to constrain T
; it can be anything, even the unknown
type. That can be accomplished by just leaving it as type DataType<T> = ...
without a constraint on the T
.
interface MyObject {
foo: string;
bar: boolean;
}
type DataType<T> =
T extends keyof MyObject ? MyObject[T] : T;
type StrType = DataType<'foo'>; // string
type NumType = DataType<number>; // number
But if you do that, you will lose IntelliSense hints suggesting the string literal type members of keyof MyObject
:
// type BooType = DataType<'⃒'>
// ----------------------> ^^ <---
// IntelliSense prompts here with NOTHING