我想在Typescript/React中使用一个简单的JS库,但是无法为它创建定义文件。该库是google-kgsearch(https://www.npmjs.com/package/google-kgsearch),以CommonJS风格导出单个函数。我可以成功地导入和调用该函数,但是无法确定如何引用结果回调的参数类型。
以下是大部分库代码:
我的问题是,我无法从另一个文件中引用搜索回调返回的KGS.EntitySearchResult数组。以下是我的库使用方式:
非常感谢您对如何使结果接口对我的调用代码可见的任何建议,但请不要搞乱默认导出。
以下是大部分库代码:
function KGSearch (api_key) {
this.search = (opts, callback) => {
....
request({ url: api_url, json: true }, (err, res, data) => {
if (err) callback(err)
callback(null, data.itemListElement)
})
....
return this
}
}
module.exports = (api_key) => {
if (!api_key || typeof api_key !== 'string') {
throw Error(`[kgsearch] missing 'api_key' {string} argument`)
}
return new KGSearch(api_key)
}
以下是我对其建模的尝试。大多数接口都会建模服务返回的结果:
declare module 'google-kgsearch' {
function KGSearch(api: string): KGS.KGS;
export = KGSearch;
namespace KGS {
export interface SearchOptions {
query: string,
types?: Array<string>,
languages?: Array<string>,
limit?: number,
maxDescChars?: number
}
export interface EntitySearchResult {
"@type": string,
result: Result,
resultScore: number
}
export interface Result {
"@id": string,
name: string,
"@type": Array<string>,
image: Image,
detailedDescription: DetailedDescription,
url: string
}
export interface Image {
contentUrl: string,
url: string
}
export interface DetailedDescription {
articleBody: string,
url: string,
license: string
}
export interface KGS {
search: (opts: SearchOptions, callback: (err: string, items: Array<EntitySearchResult>) => void) => KGS.KGS;
}
}
}
我的问题是,我无法从另一个文件中引用搜索回调返回的KGS.EntitySearchResult数组。以下是我的库使用方式:
import KGSearch = require('google-kgsearch');
const kGraph = KGSearch(API_KEY);
interface State {
value: string;
results: Array<KGS.EntitySearchResult>; // <-- Does not work!!
}
class GKGQuery extends React.Component<Props, object> {
state : State;
handleSubmit(event: React.FormEvent<HTMLFormElement>) {
kGraph.search({ query: this.state.value }, (err, items) => { this.setState({results: items}); });
event.preventDefault();
}
....
}
非常感谢您对如何使结果接口对我的调用代码可见的任何建议,但请不要搞乱默认导出。
import ... = require('...');
来引入 CommonJS 模块,这是一个非常好的实践。赞! - Aluan Haddad