react-select 使用 TypeScript 的异步加载选项
react-select async loadOptions with TypeScript
我正在将现有的 React 应用程序转换为打字稿,但我无法让 react-select 异步 loadOptions
正确解析为打字稿。
export type userType = {
loginId: string,
firstName: string,
lastName: string,
email: string,
}
<AsyncSelect
id={n.id}
name={n.id}
isClearable={true}
onBlur={handleBlur}
onChange={onChange}
placeholder={"Search by name, email or login ID"}
value={input}
className={input_class}
loadOptions={loadOptions}
/>
const loadOptions = async (inputText: string, callback: any) => {
axios.get(`myAPI_URI`)
.then((response) => {
let data: userType[] = response.data.results;
return data.map(result => {
return labelFormatter(result)
})
});
}
const labelFormatter = (i: any) => {
return {
label: i.loginId + ' - ' + i.firstName + ' ' + i.lastName + ' - ' + i.email,
value: i.loginId,
}
}
错误是
No overload matches this call.
Overload 1 of 2, '(props: Props<filteredOptionType, false, GroupTypeBase<filteredOptionType>> | Readonly<Props<filteredOptionType, false, GroupTypeBase<...>>>): Async<...>', gave the following error.
Type '(inputText: string, callback: any) => Promise<void>' is not assignable to type '(inputValue: string, callback: (options: readonly (filteredOptionType | GroupTypeBase<filteredOptionType>)[]) => void) => void | Promise<...>'.
Type 'Promise<void>' is not assignable to type 'void | Promise<readonly (filteredOptionType | GroupTypeBase<filteredOptionType>)[]>'.
Type 'Promise<void>' is not assignable to type 'Promise<readonly (filteredOptionType | GroupTypeBase<filteredOptionType>)[]>'.
Type 'void' is not assignable to type 'readonly (filteredOptionType | GroupTypeBase<filteredOptionType>)[]'.
Overload 2 of 2, '(props: Props<filteredOptionType, false, GroupTypeBase<filteredOptionType>>, context: any): Async<filteredOptionType, false, GroupTypeBase<...>>', gave the following error.
Type '(inputText: string, callback: any) => Promise<void>' is not assignable to type '(inputValue: string, callback: (options: readonly (filteredOptionType | GroupTypeBase<filteredOptionType>)[]) => void) => void | Promise<...>'. TS2769
我不明白我需要在哪里声明 return 类型才能使 loadOptions
正常工作。
如果那是您的 loadOptions
函数的实际代码,那么它有几个问题:
- 它没有 return 任何有意义的值(它 return 是
undefined
,占 async
它有 return 类型 Promise<void>
)
- 它没有副作用
从实际的角度来看,它没有任何用处,只是丢弃了响应数据。
要解决此问题,您可以采用以下方法之一:
- Return 有用的东西。然后你必须注释函数的 return 类型:
import { OptionTypeBase } from "react-select/src/types"
const labelFormatter = (i: userType): OptionTypeBase => {
return {
label: i.loginId + ' - ' + i.firstName + ' ' + i.lastName + ' - ' + i.email,
value: i.loginId,
}
}
// add `return` keyword
const loadOptions = async (
inputText: string,
callback: any
): Promise<OptionTypeBase[]> => {
return axios.get(`myAPI_URI`)
.then((response) => {
let data: userType[] = response.data.results;
return data.map(result => {
return labelFormatter(result)
})
});
}
// or remove curly braces
const loadOptions = async (
inputText: string,
callback: any
): Promise<OptionTypeBase[]> =>
axios.get(`myAPI_URI`)
.then((response) => {
let data: userType[] = response.data.results;
return data.map(result => {
return labelFormatter(result)
})
});
- 或执行副作用:
// no `async` keyword. and using callback inside the function body
const loadOptions = (
inputText: string,
callback: (options: OptionTypeBase[]) => void
): void => {
axios.get(`myAPI_URI`).then((response) => {
let data: userType[] = response.data.results;
callback(data.map((result) => {
return labelFormatter(result);
}))
});
};
我正在将现有的 React 应用程序转换为打字稿,但我无法让 react-select 异步 loadOptions
正确解析为打字稿。
export type userType = {
loginId: string,
firstName: string,
lastName: string,
email: string,
}
<AsyncSelect
id={n.id}
name={n.id}
isClearable={true}
onBlur={handleBlur}
onChange={onChange}
placeholder={"Search by name, email or login ID"}
value={input}
className={input_class}
loadOptions={loadOptions}
/>
const loadOptions = async (inputText: string, callback: any) => {
axios.get(`myAPI_URI`)
.then((response) => {
let data: userType[] = response.data.results;
return data.map(result => {
return labelFormatter(result)
})
});
}
const labelFormatter = (i: any) => {
return {
label: i.loginId + ' - ' + i.firstName + ' ' + i.lastName + ' - ' + i.email,
value: i.loginId,
}
}
错误是
No overload matches this call.
Overload 1 of 2, '(props: Props<filteredOptionType, false, GroupTypeBase<filteredOptionType>> | Readonly<Props<filteredOptionType, false, GroupTypeBase<...>>>): Async<...>', gave the following error.
Type '(inputText: string, callback: any) => Promise<void>' is not assignable to type '(inputValue: string, callback: (options: readonly (filteredOptionType | GroupTypeBase<filteredOptionType>)[]) => void) => void | Promise<...>'.
Type 'Promise<void>' is not assignable to type 'void | Promise<readonly (filteredOptionType | GroupTypeBase<filteredOptionType>)[]>'.
Type 'Promise<void>' is not assignable to type 'Promise<readonly (filteredOptionType | GroupTypeBase<filteredOptionType>)[]>'.
Type 'void' is not assignable to type 'readonly (filteredOptionType | GroupTypeBase<filteredOptionType>)[]'.
Overload 2 of 2, '(props: Props<filteredOptionType, false, GroupTypeBase<filteredOptionType>>, context: any): Async<filteredOptionType, false, GroupTypeBase<...>>', gave the following error.
Type '(inputText: string, callback: any) => Promise<void>' is not assignable to type '(inputValue: string, callback: (options: readonly (filteredOptionType | GroupTypeBase<filteredOptionType>)[]) => void) => void | Promise<...>'. TS2769
我不明白我需要在哪里声明 return 类型才能使 loadOptions
正常工作。
如果那是您的 loadOptions
函数的实际代码,那么它有几个问题:
- 它没有 return 任何有意义的值(它 return 是
undefined
,占async
它有 return 类型Promise<void>
) - 它没有副作用
从实际的角度来看,它没有任何用处,只是丢弃了响应数据。
要解决此问题,您可以采用以下方法之一:
- Return 有用的东西。然后你必须注释函数的 return 类型:
import { OptionTypeBase } from "react-select/src/types"
const labelFormatter = (i: userType): OptionTypeBase => {
return {
label: i.loginId + ' - ' + i.firstName + ' ' + i.lastName + ' - ' + i.email,
value: i.loginId,
}
}
// add `return` keyword
const loadOptions = async (
inputText: string,
callback: any
): Promise<OptionTypeBase[]> => {
return axios.get(`myAPI_URI`)
.then((response) => {
let data: userType[] = response.data.results;
return data.map(result => {
return labelFormatter(result)
})
});
}
// or remove curly braces
const loadOptions = async (
inputText: string,
callback: any
): Promise<OptionTypeBase[]> =>
axios.get(`myAPI_URI`)
.then((response) => {
let data: userType[] = response.data.results;
return data.map(result => {
return labelFormatter(result)
})
});
- 或执行副作用:
// no `async` keyword. and using callback inside the function body
const loadOptions = (
inputText: string,
callback: (options: OptionTypeBase[]) => void
): void => {
axios.get(`myAPI_URI`).then((response) => {
let data: userType[] = response.data.results;
callback(data.map((result) => {
return labelFormatter(result);
}))
});
};