最近我将TSConfig属性suppressImplicitAnyIndexErrors从true
切换到false
,以迫使我编写更好的代码,但我遇到了这个问题,这是唯一一个我无法修复的问题。
这是一个简单的形式,有一个复选框和一个文本输入,将添加一个true
到filters
,如果复选框被选中或删除属性,如果它存在的情况下,它是false
。如果有任何文本,也会添加搜索字符串,如果没有,则会像checkbox属性一样删除。
interface UserFilters {
searchText?: string;
hasAction?: boolean;
}
const filters = {} as UserFilters;
function filterUsers(filterName: keyof UserFilters, value: string | boolean | undefined) {
if (value) filters[filterName] = value; // ERROR: Type 'string' is not assignable to type 'undefined'
else delete filters[filterName];
}
我做了这个TypeScript playground来告诉你错误。
filterUsers
的问题是filterName
和value
在任何方面都不相关,因此例如filterUsers('searchText', true)
将是一个有效的调用。这也是为什么你不能让类型在主体中工作。
你可以通过使函数泛型来修复它:
function filterUsers<K extends keyof UserFilters>(
filterName: K,
value: UserFilters[K],
) {
if (value) filters[filterName] = value
else delete filters[filterName]
}
打印稿操场