如何使用 Twit 的 Typescript 定义;回调函数不可分配



我刚刚开始学习Node和typescript。我是一名经验丰富的Java工程师,做过前端工作,但主要是复制粘贴修改,没有完全理解所有的javascript。现在,我正试图深入了解Node、JS和Typescript,但我认为我已经跳得太远了,不了解发生了什么。这只是一个小的个人项目。我想使用类,也喜欢TS提供的东西,但它似乎引入了比它解决的更多的复杂性和问题,所以也许这不值得。

我正在尝试使用Twit软件包来阅读推文。在尝试将其转换为TS之前,它在普通js中运行良好。这是我的工作js:

var _ = require('lodash');
var Twit = require('twit');
var T = new Twit({
consumer_key:         '..'
, consumer_secret:      '..'
, access_token:         '..'
, access_token_secret:  '..'
})
var options = { screen_name: 'TwitterUser',
count: 200 };
T.get('statuses/user_timeline', options , function(err, data) {
// it comes latest first; I want earliest first
data.reverse();
console.log(data[0]);
// try to filter out alerts only
var alerts = _.filter(data, function(tweet){
return (tweet.text.indexOf('#alert') > -1) ||
(tweet.text.indexOf('#ALERT') > -1);
});
for (var i = 0; i < alerts.length ; i++) {
console.log(alerts[i].created_at + '  ' + alerts[i].text);
}
})

这是打字本版本:

import { IncomingMessage } from "http";
import _ from "lodash";
import Twit from "twit";
export class TwitterListener {
getlatestTweets() {
const T = new Twit({
consumer_key:         '..'
, consumer_secret:      '..'
, access_token:         '..'
, access_token_secret:  '..'
})
const options = { screen_name: 'TwitterUser',
count: 200 };
T.get('statuses/user_timeline', options, function(err, result: Response, data: IncomingMessage) {
// it comes latest first; I want earliest first
data.reverse();
console.log(data[0]);

// try to filter out alerts only
const alerts = _.filter(data, function(tweet: Twit.Twitter.Status) {
return (tweet.text.indexOf('#alert') > -1) ||
(tweet.text.indexOf('#ALERT') > -1);
});

for (let i = 0; i < alerts.length ; i++) {
console.log(alerts[i].created_at + '  ' + alerts[i].text);
}
})
}
}

最大的问题是获取用户时间线的回调。VS Code linter说"类型的参数(无论我尝试过什么(都不能分配给类型为Callback的参数。"。确定性打字的打字文档说这应该是一个类似的回调:

export interface Callback {
(err: Error, result: Response, response: IncomingMessage): void;
}

这就是为什么我试着把它改成那样。在纯js版本中,回调是function(err, data),数据是tweets/status数组,我认为它可能是类似function(err:Error, data: any[])function(err, data: Array<Twit.Twitter.Status>)的东西,我也尝试过,但得到了相同的错误。我有一种感觉,这是我如何定义这个回调函数的语法,但我不知道是什么。

我不明白回调定义是如何从function(err, data)变成带有结果和响应的回调类型的。我错过了什么?

这里的问题——就像Aluan Haddad在评论中提到的那样——函数的第二个参数的类型与Twit包中指定的回调函数类型不兼容。

回调函数的类型如下:

export interface Callback {
(err: Error, result: Response, response: IncomingMessage): void;
}

我认为你混淆的原因是,这个定义中的响应类型并不是指内置的响应类型,但Twit包用这个来覆盖(阴影(这个定义:

export type Response = object;

这种类型定义有点令人困惑,至少命名应该反映它是Twitter响应,而不是描述内置在浏览器中的Fetch API响应的内置定义。

为了解决你的问题,你必须从Twit包导入这个响应定义,或者通过";Twit.Response";。将其导入到您自己的文件中,也会遮蔽那里的内置定义,并且您可以引用";响应";Twit包的类型。

import Twit, {Response} from "twit"

我想指出的是,你的函数的强类型参数不是问题所在,相反,它们会导致你质疑你的代码。如果没有你自己函数中的类型,你就不会看到问题,也可能永远不会看到存在误解。

在查看twit的文档后,我意识到回调接受三(3(个参数err - an errordata - arrays of tweetsresponse - response object from twitter。js版本之所以有效,是因为javascript具有松散类型的特性。

最新更新