Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/427.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用Twit';s字体脚本定义;回调函数不可赋值_Javascript_Typescript - Fatal编程技术网

Javascript 如何使用Twit';s字体脚本定义;回调函数不可赋值

Javascript 如何使用Twit';s字体脚本定义;回调函数不可赋值,javascript,typescript,Javascript,Typescript,我刚刚开始学习Node和typescript。我是一名经验丰富的Java工程师,做过前端工作,但主要是复制粘贴修改,没有完全理解所有javascript。现在我正试图深入了解Node、JS和Typescript,我认为我在不了解所有情况的情况下已经走得太远了。这只是一个小的个人项目。我想使用类,喜欢TS提供的东西,但它似乎带来了比它解决的更多的复杂性和问题,所以可能不值得 我正在尝试使用Twit包来阅读tweet。在尝试将其转换为TS之前,它在普通js中运行良好。这是我的工作js: var _

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

我正在尝试使用Twit包来阅读tweet。在尝试将其转换为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);
  }
})
这就是为什么我想把它改成那样。我认为,在普通的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"