I have some classes which all have a property called data. I have a type definition for the data type mapping which I'd like to use in the generics definition. So this is my code:
type DataTypes = {
age: number;
firstName: string;
lastName: string;
};
abstract class AbstractBase<T extends DataTypes> {
data: T;
}
class AgeComponent extends AbstractBase<DataTypes.age> {}
class FirstNameComponent extends AbstractBase<DataTypes.firstName> {}
class LastNameComponent extends AbstractBase<DataTypes.lastName> {}
So when using abstract class AbstractBase<T extends DataTypes>
I'd like to tell TypeScript to accept the types according to the mappings in the type DataTypes.
Is this possible with TypeScript?
CodePudding user response:
You can pass to AbstractBase
the key from DataTypes
you want to use, and the use index access types to get the type from DataTypes
:
abstract class AbstractBase<T extends keyof DataTypes> {
data!: DataTypes[T];
}
class AgeComponent extends AbstractBase<"age"> {}
Or you can pass the type of the property directly:
abstract class AbstractBase<T extends DataTypes[keyof DataTypes]> {
data!: T;
}
class AgeComponent extends AbstractBase<DataTypes["age"]> {}
CodePudding user response:
You have to use Index access type
as .
ones do not work in Typescript
type DataTypes = {
age: number;
firstName: string;
lastName: string;
};
abstract class AbstractBase<T extends DataTypes[keyof DataTypes]> {
data !: T;
}
class AgeComponent extends AbstractBase<DataTypes["age"]> {
}
class FirstNameComponent extends AbstractBase<DataTypes["firstName"]> {}
class LastNameComponent extends AbstractBase<DataTypes["lastName"]> {}
// Test the inference
new AgeComponent().data // number
new FirstNameComponent().data // string
new LastNameComponent().data // string