【发布时间】:2020-09-18 23:03:27
【问题描述】:
我刚刚开始接触 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);
}
})
这是 Typescript 版本:
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 说“类型参数(无论我尝试过什么)都不能分配给回调类型的参数。 DefinitelyTyped 的类型文档说这应该是这样的回调:
export interface Callback {
(err: Error, result: Response, response: IncomingMessage): void;
}
这就是我尝试将其更改为的原因。我从简单的 js 版本中想到,其中回调是 function(err, data) 并且数据是一组推文/状态,它可能类似于 function(err:Error, data: any[]) 或 function(err, data: Array<Twit.Twitter.Status>),我也尝试过,但得到了同样的错误。我感觉这是我定义这个回调函数的语法,但不知道是什么。
我不明白回调定义如何从 function(err, data) 到带有结果和响应的回调类型。我错过了什么?
【问题讨论】:
-
错误是
Response类型不同,它们只是名称相同。请注意,显式指定回调参数类型是一种不好的做法。应推断回调参数类型的正确性。 -
@AluanHaddad 感谢您的回复;您说“明确指定回调参数类型是一种不好的做法”;我很困惑,我认为强类型是 Typescript 的要点之一?按照您的建议推断出的回调参数类型应该如何?
-
强类型是重点。指定编译器已知的类型不会增加类型的强度。
[1, 2, 3].map(x => x + x)在 TypeScript 中是强类型的。所有类型都是已知的并经过验证。[1, 2, 3].map((x: number) => x + x)不会增加类型的强度。但是,在许多情况下,指定参数的类型可以减少类型信息,因为指定的类型可能是子类型,而且关键的是,如果类型不知道编译器您将抑制@987654332 @错误。
标签: javascript typescript