<code>enum FilterType {
userId = 'userId',
date = 'date',
section ='section'
}
type FilterValueType = {
[FilterType.userId]: string;
[FilterType.date]: Date;
[FilterType.section]: number;
};
const filters = {} as FilterValueType
function setFilter<T extends FilterType>(type: T, value: FilterValueType[T] ) {
if (type === FilterType.userId) {
filters.userId = value
}
if (type === FilterType.date) {
filters.date = value
}
if (type === FilterType.section) {
filters.section = value
}
}
</code>
<code>enum FilterType {
userId = 'userId',
date = 'date',
section ='section'
}
type FilterValueType = {
[FilterType.userId]: string;
[FilterType.date]: Date;
[FilterType.section]: number;
};
const filters = {} as FilterValueType
function setFilter<T extends FilterType>(type: T, value: FilterValueType[T] ) {
if (type === FilterType.userId) {
filters.userId = value
}
if (type === FilterType.date) {
filters.date = value
}
if (type === FilterType.section) {
filters.section = value
}
}
</code>
enum FilterType {
userId = 'userId',
date = 'date',
section ='section'
}
type FilterValueType = {
[FilterType.userId]: string;
[FilterType.date]: Date;
[FilterType.section]: number;
};
const filters = {} as FilterValueType
function setFilter<T extends FilterType>(type: T, value: FilterValueType[T] ) {
if (type === FilterType.userId) {
filters.userId = value
}
if (type === FilterType.date) {
filters.date = value
}
if (type === FilterType.section) {
filters.section = value
}
}
I have come snipped above, I need function know value
type depend on type
param . Typescript shows me Type 'string | number | Date' is not assignable to type 'string'.
0
So the problem is you are depending type of your value: FilterValueType[T]
dependent on type: T
, but your type
is any one of your FilterType
values. So at the compile team, FilterValueType[T]
will resolve to all the possible values. You can use type assertion and convert your code as follows:-
<code>
enum FilterType {
userId = 'userId',
date = 'date',
section ='section'
}
type FilterValueType = {
[FilterType.userId]?: string;
[FilterType.date]?: Date;
[FilterType.section]?: number;
};
const filters: FilterValueType = {}
function setFilter<T extends FilterType>(type: T, value: FilterValueType[T] ) {
if (type === FilterType.userId) {
filters.userId = value as string
}
if (type === FilterType.date) {
filters.date = value as Date
}
if (type === FilterType.userId) {
filters.section = value as number
}
}
</code>
<code>
enum FilterType {
userId = 'userId',
date = 'date',
section ='section'
}
type FilterValueType = {
[FilterType.userId]?: string;
[FilterType.date]?: Date;
[FilterType.section]?: number;
};
const filters: FilterValueType = {}
function setFilter<T extends FilterType>(type: T, value: FilterValueType[T] ) {
if (type === FilterType.userId) {
filters.userId = value as string
}
if (type === FilterType.date) {
filters.date = value as Date
}
if (type === FilterType.userId) {
filters.section = value as number
}
}
</code>
enum FilterType {
userId = 'userId',
date = 'date',
section ='section'
}
type FilterValueType = {
[FilterType.userId]?: string;
[FilterType.date]?: Date;
[FilterType.section]?: number;
};
const filters: FilterValueType = {}
function setFilter<T extends FilterType>(type: T, value: FilterValueType[T] ) {
if (type === FilterType.userId) {
filters.userId = value as string
}
if (type === FilterType.date) {
filters.date = value as Date
}
if (type === FilterType.userId) {
filters.section = value as number
}
}
This should work, but I am not really sure if this is the best way to handle it.
4