Javascript 如何使用Twit';s字体脚本定义;回调函数不可赋值
我刚刚开始学习Node和typescript。我是一名经验丰富的Java工程师,做过前端工作,但主要是复制粘贴修改,没有完全理解所有javascript。现在我正试图深入了解Node、JS和Typescript,我认为我在不了解所有情况的情况下已经走得太远了。这只是一个小的个人项目。我想使用类,喜欢TS提供的东西,但它似乎带来了比它解决的更多的复杂性和问题,所以可能不值得 我正在尝试使用Twit包来阅读tweet。在尝试将其转换为TS之前,它在普通js中运行良好。这是我的工作js:Javascript 如何使用Twit';s字体脚本定义;回调函数不可赋值,javascript,typescript,Javascript,Typescript,我刚刚开始学习Node和typescript。我是一名经验丰富的Java工程师,做过前端工作,但主要是复制粘贴修改,没有完全理解所有javascript。现在我正试图深入了解Node、JS和Typescript,我认为我在不了解所有情况的情况下已经走得太远了。这只是一个小的个人项目。我想使用类,喜欢TS提供的东西,但它似乎带来了比它解决的更多的复杂性和问题,所以可能不值得 我正在尝试使用Twit包来阅读tweet。在尝试将其转换为TS之前,它在普通js中运行良好。这是我的工作js: var _
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);
}
})
这就是为什么我想把它改成那样。我认为,在普通的js版本中,回调函数是function(err,data)
,数据是tweet/状态的数组,它可能类似于function(err:Error,data:any[])
或function(err,data:array)
,我也尝试过,但也遇到了同样的错误。我感觉这是我如何定义这个回调函数的语法,但不知道是什么
我不明白回调定义是如何从
函数(err,data)
转变为包含结果和响应的回调类型的。我遗漏了什么?在查看之后,我意识到回调接受三(3)个参数err-一个错误
,数据-tweets数组
和响应-twitter的响应对象
。js版本工作的原因是javascript的松散类型特性。这里的问题是——就像Aluan Haddad在评论中提到的那样——函数的第二个参数的类型与Twit包中指定的回调函数类型不兼容
import Twit, {Response} from "twit"
回调函数的类型如下:
export interface Callback {
(err: Error, result: Response, response: IncomingMessage): void;
}
我认为造成您混淆的原因是,此定义中的响应类型并不是指内置的响应类型,但Twit包使用以下定义覆盖(阴影)此定义:
export type Response = object;
这个类型定义有点混乱,至少命名应该反映出它是一个Twitter响应,而不是描述内置浏览器的内置定义
要解决问题,您必须从Twit包导入此响应定义,或通过“Twit.Response”引用它。将其导入到您自己的文件中,也会隐藏其中的内置定义,您可以参考Twit包的“Response”类型
import Twit, {Response} from "twit"
我想指出的是,函数的强类型参数不是问题所在,相反,它们会导致您对代码产生疑问。如果没有您自己函数中的类型,您就不会看到问题,也可能永远不会看到有误解。错误在于
响应
类型不同,它们只是具有相同的名称。请注意,显式指定回调参数类型是一种不好的做法。应推断回调参数类型的正确性。@AluanHaddad感谢您的回复;您说过“显式指定回调参数类型是一种糟糕的做法”;我很困惑,我以为打字是打字脚本的要点之一?按照您的建议推断回调参数类型时,这应该是什么样子的呢?重点是强类型。指定编译器已知的类型不会增加类型的强度<代码>[1,2,3]。映射(x=>x+x)在TypeScript中是强类型的。所有类型都是已知的并经过验证的<代码>[1,2,3]。映射((x:number)=>x+x)不会增加类型的强度。但是,在许多情况下,指定参数的类型可以减少类型信息,因为指定的类型可能是一个子类型,而且,关键是,如果编译器不知道该类型,您将禁止出现noImplicitAny
错误。谢谢!我从Aluan Haddad那里了解到这是错误的响应类型,但我甚至不知道如何导入正确的响应类型。现在我的问题是如何获取实际的twitter数据,因为响应和IncomingMessage类型似乎不包含任何实际的twitter数据。IncomingMessage属性看起来像更基本的http内容,响应只是一个普通对象。我遗漏了什么?如果您查看链接的DefinitlyTyped文档,您会发现它就是这样工作的:IncomingMessage是从“http”导入的,响应只是一个重命名的“object”类型。
import Twit, {Response} from "twit"