打字稿:限制可以通过特定功能的泛型和索引访问类型传递的键的数量
Typescript: Limit the number of keys that can be passed via generics and indexed access types for a particular function
抱歉这个标题,可能有点混乱?让我解释一下我的问题。
我正在使用 React 状态管理库,其中我的应用程序状态如下所示:
type ApplicationState = {
loading: boolean;
data: string[];
colors: number[];
alerts: any;
error: string;
}
const state: ApplicationState = {
loading: false,
data: [],
colors: [],
alerts: {},
error: "some error"
}
然后我有一个setter,它确保键是ApplicationState的键,值是Application状态的值类型之一。
const mySetter: <K extends keyof ApplicationState>(key: K, value: ApplicationState[K]) => ApplicationState = (key, value) => {
return {
...state,
[key]: value,
}
}
所以我的问题是,如何将键 (K) 限制为仅属于某些类型的状态(例如,我只希望它更改加载、警报和错误)?它当前的设置方式允许使用 ApplicationState 的任何键 (K)。
感谢您的帮助!
只需使用像'loading' | 'error'
这样的联合类型,例如:
type ApplicationState = {
loading: boolean;
data: string[];
colors: number[];
alerts: any;
error: string;
}
const state: ApplicationState = {
loading: false,
data: [],
colors: [],
alerts: {},
error: "some error"
}
type SomeApplicationStates = 'loading' | 'error';
const mySetter: <K extends SomeApplicationStates>(key: K, value: ApplicationState[K]) => ApplicationState = (key, value) => {
return {
...state,
[key]: value,
}
}
您也可以为类型参数写 <K extends ('loading' | 'error')>
。
抱歉这个标题,可能有点混乱?让我解释一下我的问题。
我正在使用 React 状态管理库,其中我的应用程序状态如下所示:
type ApplicationState = {
loading: boolean;
data: string[];
colors: number[];
alerts: any;
error: string;
}
const state: ApplicationState = {
loading: false,
data: [],
colors: [],
alerts: {},
error: "some error"
}
然后我有一个setter,它确保键是ApplicationState的键,值是Application状态的值类型之一。
const mySetter: <K extends keyof ApplicationState>(key: K, value: ApplicationState[K]) => ApplicationState = (key, value) => {
return {
...state,
[key]: value,
}
}
所以我的问题是,如何将键 (K) 限制为仅属于某些类型的状态(例如,我只希望它更改加载、警报和错误)?它当前的设置方式允许使用 ApplicationState 的任何键 (K)。
感谢您的帮助!
只需使用像'loading' | 'error'
这样的联合类型,例如:
type ApplicationState = {
loading: boolean;
data: string[];
colors: number[];
alerts: any;
error: string;
}
const state: ApplicationState = {
loading: false,
data: [],
colors: [],
alerts: {},
error: "some error"
}
type SomeApplicationStates = 'loading' | 'error';
const mySetter: <K extends SomeApplicationStates>(key: K, value: ApplicationState[K]) => ApplicationState = (key, value) => {
return {
...state,
[key]: value,
}
}
您也可以为类型参数写 <K extends ('loading' | 'error')>
。