幼儿饰品瑜伽美体用品微软
投稿投诉
微软创意
爱情通信
用品婚姻
爱好看病
美体软件
影音星座
瑜伽周边
星座办公
饰品塑形
搞笑减肥
幼儿两性
智家潮品

如何在TypeScript中使用函数

  介绍
  创建和使用函数是任何编程语言的基本内容,TypeScript也不例外。TypeScript完全支持现有的JavaScript函数语法,同时,还添加了类型信息和函数重载作为新特性。除了为函数提供额外的文档外,类型信息还可以减少代码中出现错误的机会,因为将无效数据类型传递给类型安全函数的风险较低。
  在本教程中,我们将从使用类型信息创建最基本的函数开始,然后,转到更复杂的场景,例如,使用剩余参数和函数重载。我们将尝试不同的代码示例,我们可以在自己的TypeScript环境或TypeScriptPlayground(一个允许我们直接在浏览器中编写TypeScript的在线环境)中遵循这些示例。
  准备工作
  要完成本教程内容,我们需要做如下准备工作:
  一个环境,我们可以在其中执行TypeScript程序以跟随示例。要在本地计算机上进行设置,我们将需要以下内容:
  为了运行处理TypeScript相关包的开发环境,同时,安装了Node和npm(或yarn)。本教程使用Node。js版本14。3。0和npm版本6。14。5进行了测试。要在macOS或Ubuntu18。04上安装,请按照如何在macOS上安装Node。js和创建本地开发环境或如何在Ubuntu18。04上安装Node。js的使用PPA安装部分中的步骤进行操作。如果使用的是适用于Linux的Windows子系统(WSL),这也适用。
  此外,我们需要在机器上安装TypeScript编译器(tsc)。为此,请参阅官方TypeScript网站。
  如果不想在本地机器上创建TypeScript环境,可以使用官方的TypeScriptPlayground来跟随。
  将需要足够的JavaScript知识,尤其是ES6语法,例如解构、rest运算符和导入导出。如果需要有关这些主题的更多知识,建议阅读我们的JavaScript系列教程。
  本教程将参考支持TypeScript并显示内联错误的文本编辑器的各个方面。这不是使用TypeScript所必需的,但确实可以更多地利用TypeScript功能。为了获得这些好处,我们可以使用像VisualStudioCode这样的文本编辑器,它完全支持开箱即用的TypeScript。我们也可以在TypeScriptPlayground中尝试这些好处。
  本教程中显示的所有示例都是使用TypeScript4。2。2版创建的。
  创建类型化函数
  在本节中,我们将在TypeScript中创建函数,然后向它们添加类型信息。
  在JavaScript中,可以通过多种方式声明函数。最流行的一种是使用function关键字,如下所示:functionsum(a,b){returnab;}
  在本例中,sum是函数的名称,(a,b)是参数,{returnab;}是函数体。
  在TypeScript中创建函数的语法是相同的,除了一个主要的补充:我们可以让编译器知道每个参数或参数应该具有什么类型。以下代码块显示了一般语法,突出显示了类型声明:functionfunctionName(param1:Param1Type,param2:Param2Type):ReturnType{。。。bodyofthefunction}
  使用此语法,我们可以将类型添加到前面显示的sum函数的参数:functionsum(a:number,b:number){returnab;}
  这确保a和b是数值。
  我们还可以添加返回值的类型:functionsum(a:number,b:number):number{returnab;}
  现在TypeScript将期望sum函数返回一个数字值。如果我们使用一些参数调用函数并将结果值存储在名为result的变量中:constresultsum(1,2);
  结果变量将具有类型编号。如果我们正在使用TypeScript游乐场或使用完全支持TypeScript的文本编辑器,将光标悬停在result上将显示constresult:number,表明TypeScript从函数声明中隐含了它的类型。
  如果我们调用函数的值的类型与函数预期的类型不同,TypeScript编译器(tsc)会给我们错误2345。对sum函数执行以下调用:sum(shark,whale);
  这将给出以下内容:OutputArgumentoftypestringisnotassignabletoparameteroftypenumber。(2345)
  我们可以在函数中使用任何类型,而不仅仅是基本类型。例如,假设我们有一个看起来像这样的User类型:typeUser{firstName:string;lastName:string;};
  我们可以创建一个返回用户全名的函数,如下所示:functiongetUserFullName(user:User):string{return{user。firstName}{user。lastName};}
  大多数时候TypeScript足够聪明,可以推断出函数的返回类型,因此,在这种情况下,我们可以从函数声明中删除返回类型:functiongetUserFullName(user:User){return{user。firstName}{user。lastName};}
  请注意,我们删除了:string部分,它是函数的返回类型。当我们在函数体中返回字符串时,TypeScript正确地假定我们的函数具有字符串返回类型。
  要现在调用我们的函数,我们必须传递一个与User类型具有相同形状的对象:typeUser{firstName:string;lastName:string;};functiongetUserFullName(user:User){return{user。firstName}{user。lastName};}constuser:User{firstName:Jon,lastName:Doe};constuserFullNamegetUserFullName(user);
  此代码将成功通过TypeScript类型检查器。如果我们将鼠标悬停在编辑器中的userFullName常量上,编辑器会将其类型识别为字符串。
  TypeScript中的可选函数参数
  创建函数时并不总是需要所有参数。在本节中,我们将学习如何在TypeScript中将函数参数标记为可选。
  要将函数参数转换为可选参数,请添加?参数名称后面的修饰符。给定一个类型为T的函数参数param1,我们可以通过添加?使param1成为可选参数,如下所示:param1?:T
  例如,为我们的getUserFullName函数添加一个可选的前缀参数,它是一个可选字符串,可以作为前缀添加到用户的全名:typeUser{firstName:string;lastName:string;};functiongetUserFullName(user:User,prefix?:string){return{prefix??}{user。firstName}{user。lastName};}
  在此代码块的第一个突出显示部分中,我们正在向函数添加一个可选的前缀参数,在第二个突出显示部分中,我们将使用它作为用户全名的前缀。为此,我们正在使用无效合并运算符??。这样,我们将仅使用已定义的前缀值;否则,该函数将使用空字符串。
  现在,我们可以使用或不使用前缀参数调用我们的函数,如下所示:typeUser{firstName:string;lastName:string;};functiongetUserFullName(user:User,prefix?:string){return{prefix??}{user。firstName}{user。lastName};}constuser:User{firstName:Jon,lastName:Doe};constuserFullNamegetUserFullName(user);constmrUserFullNamegetUserFullName(user,Mr。);
  在这种情况下,userFullName的值为JonDoe,而mrUserFullName的值为Mr。JonDoe。
  请注意,我们不能在必需参数之前添加可选参数;它必须在系列的最后列出,就像(user:User,prefix?:string)一样。首先,列出它会使TypeScriptCompiler返回错误1016:OutputArequiredparametercannotfollowanoptionalparameter。(1016)
  键入的箭头函数表达式
  到目前为止,本教程已经展示了如何在TypeScript中键入使用function关键字定义的普通函数。但在JavaScript中,我们可以通过多种方式定义函数,例如使用箭头函数。在本节中,我们将向TypeScript中的箭头函数添加类型。
  向箭头函数添加类型的语法与向普通函数添加类型几乎相同。为了说明这一点,请将getUserFullName函数更改为箭头函数表达式:constgetUserFullName(user:User,prefix?:string){prefix??}{user。firstName}{user。lastName};
  如果我们想明确说明函数的返回类型,可以在()之后添加它,如以下代码块中突出显示的代码所示:constgetUserFullName(user:User,prefix?:string):string{prefix??}{user。firstName}{user。lastName};
  现在,我们可以像以前一样使用你的函数了:typeUser{firstName:string;lastName:string;};constgetUserFullName(user:User,prefix?:string){prefix??}{user。firstName}{user。lastName};constuser:User{firstName:Jon,lastName:Doe};constuserFullNamegetUserFullName(user);
  这将毫无错误地通过TypeScript类型检查器。
  注意:请记住,对JavaScript中的函数有效的所有内容也对TypeScript中的函数有效。
  函数类型
  在前面的内容中,我们向TypeScript中的函数的参数和返回值添加了类型。在本节中,我们将学习如何创建函数类型,它们是表示特定函数签名的类型。在将函数传递给其他函数时,创建与特定函数匹配的类型特别有用,例如,具有本身就是函数的参数。这是创建接受回调的函数时的常见模式。
  创建函数类型的语法类似于创建箭头函数,但有两点不同:我们删除了函数体。我们使函数声明返回返回类型本身。
  以下是创建与我们一直使用的getUserFullName函数匹配的类型的方法:typeUser{firstName:string;lastName:string;};typePrintUserNameFunction(user:User,prefix?:string)string;
  在此示例中,我们使用type关键字声明了一个新类型,然后,为括号中的两个参数提供了类型,并为箭头后面的返回值提供了类型。
  举一个更具体的例子,假设我们正在创建一个名为onEvent的事件侦听器函数,它接收事件名称作为第一个参数,第二个参数接收事件回调。事件回调本身将接收具有以下类型的对象作为第一个参数:typeEventContext{value:string;};
  然后,我们可以像这样编写onEvent函数:typeEventContext{value:string;};functiononEvent(eventName:string,eventCallback:(target:EventContext)void){。。。implementation}
  注意eventCallback参数的类型是一个函数类型:eventCallback:(target:EventTarget)void
  这意味着我们的onEvent函数需要在eventCallback参数中传递另一个函数。此函数应接受EventTarget类型的单个参数。我们的onEvent函数会忽略此函数的返回类型,因此,我们使用void作为类型。
  使用类型化异步函数
  在使用JavaScript时,使用异步函数是比较常见的。TypeScript有一种特定的方法来处理这个问题。在本节中,我们将在TypeScript中创建异步函数。
  创建异步函数的语法与用于JavaScript的语法相同,但添加了允许类型:asyncfunctionasyncFunction(param1:number){。。。functionimplementation。。。}
  向普通函数添加类型和向异步函数添加类型之间有一个主要区别:在异步函数中,返回类型必须始终是Promise泛型。Promise泛型表示由异步函数返回的Promise对象,其中T是promise解析为的值的类型。
  假设我们有一个用户类型:typeUser{id:number;firstName:string;};
  还想象一下,我们在数据存储中有一些用户对象。这些数据可以存储在任何地方,例如文件、数据库或API请求后面。为简单起见,在此示例中,我们将使用数组:typeUser{id:number;firstName:string;};constusers:User〔〕〔{id:1,firstName:Jane},{id:2,firstName:Jon}〕;
  如果我们想创建一个类型安全的函数,以异步方式按ID检索用户,我们可以这样做:asyncfunctiongetUserById(userId:number):PromiseUsernull{constfoundUserusers。find(useruser。iduserId);if(!foundUser){returnnull;}returnfoundUser;}
  在此函数中,我们首先将函数声明为异步:asyncfunctiongetUserById(userId:number):PromiseUsernull{
  然后,我们指定它接受作为第一个参数的用户ID,它必须是一个数字:asyncfunctiongetUserById(userId:number):PromiseUsernull{
  getUserById的返回类型是一个Promise,它解析为User或null。我们正在使用联合类型Usernull作为Promise泛型的类型参数。
  用户null是Promise中的T:asyncfunctiongetUserById(userId:number):PromiseUsernull{
  使用await调用我们的函数并将结果存储在名为user的变量中:typeUser{id:number;firstName:string;};constusers:User〔〕〔{id:1,firstName:Jane},{id:2,firstName:Jon}〕;asyncfunctiongetUserById(userId:number):PromiseUsernull{constfoundUserusers。find(useruser。iduserId);if(!foundUser){returnnull;}returnfoundUser;}asyncfunctionrunProgram(){constuserawaitgetUserById(1);}
  注意:我们正在使用一个名为runProgram的包装函数,因为,我们不能在文件的顶层使用await。这样做会导致TypeScript编译器发出错误1375:
  输出await表达式仅在文件是模块时才允许在文件的顶层使用,但该文件没有导入或导出。考虑添加一个空的export{}以使该文件成为一个模块。(1375)
  如果我们在编辑器或TypeScriptPlayground中将鼠标悬停在user上,我们会发现user的类型为Usernull,这正是我们的getUserById函数返回的承诺解析为的类型。
  如果删除await并直接调用该函数,则返回Promise对象:asyncfunctionrunProgram(){constuserPromisegetUserById(1);}
  如果,我们将鼠标悬停在userPromise上,我们会发现它的类型是Promise。
  大多数时候,TypeScript可以推断异步函数的返回类型,就像它对非异步函数所做的那样。
  因此,您可以省略getUserById函数的返回类型,因为它仍然被正确推断为具有类型Promise:asyncfunctiongetUserById(userId:number){constfoundUserusers。find(useruser。iduserId);if(!foundUser){returnnull;}returnfoundUser;}
  为Rest参数添加类型
  剩余参数是JavaScript中的一项功能,它允许函数以单个数组的形式接收许多参数。在本节中,我们将在TypeScript中使用剩余参数。
  通过使用rest参数后跟结果数组的类型,完全可以以类型安全的方式使用rest参数。以下面的代码为例,其中有一个名为sum的函数,它接受可变数量的数字并返回它们的总和:functionsum(。。。args:number〔〕){returnargs。reduce((accumulator,currentValue){returnaccumulatorcurrentValue;},0);}
  该函数使用。reduceArray方法迭代数组并将元素相加。请注意此处突出显示的其余参数args。类型被设置为一个数字数组:number〔〕。
  调用我们的函数正常工作:functionsum(。。。args:number〔〕){returnargs。reduce((accumulator,currentValue){returnaccumulatorcurrentValue;},0);}constsumResultsum(2,4,6,8);
  如果我们使用数字以外的任何内容调用我们的函数,例如:constsumResultsum(2,b,6,8);
  TypeScript编译器将发出错误2345:OutputArgumentoftypestringisnotassignabletoparameteroftypenumber。(2345)
  使用函数重载
  程序员有时需要一个函数来接受不同的参数,具体取决于函数的调用方式。在JavaScript中,这通常是通过有一个参数来完成的,该参数可以采用不同类型的值,如字符串或数字。将多个实现设置为相同的函数名称称为函数重载。
  使用TypeScript,我们可以创建函数重载,明确描述它们处理的不同情况,通过分别记录重载函数的每个实现来改善开发人员体验。
  本节将介绍如何在TypeScript中使用函数重载。
  假设我们有一个用户类型:typeUser{id:number;email:string;fullName:string;age:number;};
  并且我们想创建一个可以使用以下任何信息查找用户的函数:ID电子邮件年龄和全名
  我们可以像这样创建这样的函数:functiongetUser(idOrEmailOrAge:numberstring,fullName?:string):Userundefined{。。。code}
  该函数使用运算符为idOrEmailOrAge和返回值组成类型的联合。
  接下来,为我们希望使用函数的每种方式添加函数重载,如以下突出显示的代码所示:typeUser{id:number;email:string;fullName:string;age:number;};functiongetUser(id:number):Userundefined;functiongetUser(email:string):Userundefined;functiongetUser(age:number,fullName:string):Userundefined;functiongetUser(idOrEmailOrAge:numberstring,fullName?:string):Userundefined{。。。code}
  此函数具有三个重载,每个重载一个用于检索用户。创建函数重载时,在函数实现本身之前添加函数重载。函数重载没有主体;他们只有参数列表和返回类型。
  接下来,实现函数本身,它应该有一个与所有函数重载兼容的参数列表。在前面的示例中,我们的第一个参数可以是数字或字符串,因为它可以是id、电子邮件或年龄:functiongetUser(id:number):Userundefined;functiongetUser(email:string):Userundefined;functiongetUser(age:number,fullName:string):Userundefined;functiongetUser(idOrEmailOrAge:numberstring,fullName?:string):Userundefined{。。。code}
  因此,我们在函数实现中将idOrEmailorAge参数的类型设置为numberstring。这样,它就与getUser函数的所有重载兼容。
  我们还为函数添加了一个可选参数,用于当用户传递全名时:functiongetUser(id:number):Userundefined;functiongetUser(email:string):Userundefined;functiongetUser(age:number,fullName:string):Userundefined;functiongetUser(idOrEmailOrAge:numberstring,fullName?:string):Userundefined{。。。code}
  实现的功能可能如下所示,其中,我们使用用户数组作为用户的数据存储:typeUser{id:number;email:string;fullName:string;age:number;};constusers:User〔〕〔{id:1,email:janedoeexample。com,fullName:JaneDoe,age:35},{id:2,email:jondoexample。com,fullName:JonDoe,age:35}〕;functiongetUser(id:number):Userundefined;functiongetUser(email:string):Userundefined;functiongetUser(age:number,fullName:string):Userundefined;functiongetUser(idOrEmailOrAge:numberstring,fullName?:string):Userundefined{if(typeofidOrEmailOrAgestring){returnusers。find(useruser。emailidOrEmailOrAge);}if(typeoffullNamestring){returnusers。find(useruser。ageidOrEmailOrAgeuser。fullNamefullName);}else{returnusers。find(useruser。ididOrEmailOrAge);}}constuserByIdgetUser(1);constuserByEmailgetUser(janedoeexample。com);constuserByAgeAndFullNamegetUser(35,JonDoe);
  在此代码中,如果idOrEmailOrAge是一个字符串,那么,我们可以使用电子邮件键搜索用户。以下条件假设idOrEmailOrAge是一个数字,因此,它是id或年龄,具体取决于是否定义了fullName。
  函数重载的一个有趣的方面是,在大多数编辑器中,包括VSCode和TypeScriptPlayground,只要我们键入函数名称并打开第一个括号来调用函数,就会出现一个弹出窗口,其中包含所有可用的重载,如下图所示:
  如果我们为每个函数重载添加注释,该注释也将作为文档来源出现在弹出窗口中。例如,将以下突出显示的注释添加到示例重载中:。。。GetauserbytheirID。functiongetUser(id:number):Userundefined;Getauserbytheiremail。functiongetUser(email:string):Userundefined;Getauserbytheirageandfullname。functiongetUser(age:number,fullName:string):Userundefined;。。。
  现在,当我们将鼠标悬停在这些函数上时,将为每个重载显示注释,如下面的动画所示:
  用户定义的类型保护
  本教程将检查TypeScript中函数的最后一个特性是用户定义的类型保护,它们是允许TypeScript更好地推断某些值的类型的特殊函数。这些守卫在条件代码块中强制执行某些类型,其中值的类型可能会根据情况而有所不同。这些在使用Array。prototype。filter函数返回过滤的数据数组时特别有用。
  有条件地向数组添加值时的一项常见任务是检查某些条件,然后,仅在条件为真时才添加值。如果该值不为真,则代码向数组添加一个假布尔值。在使用该数组之前,我们可以使用。filter(Boolean)对其进行过滤,以确保仅返回真实值。
  当使用值调用时,布尔构造函数返回true或false,具体取决于此值是Truthy还是Falsy值。
  例如,假设我们有一个字符串数组,并且如果其他标志为真,我们只想将字符串产生式包含到该数组中:constisProductionfalseconstvaluesArray〔somestring,isProductionproduction〕functionprocessArray(array:string〔〕){dosomethingwitharray}processArray(valuesArray。filter(Boolean))
  虽然,这是在运行时完全有效的代码,但TypeScript编译器会在编译期间为我们提供错误2345:OutputArgumentoftype(stringboolean)〔〕isnotassignabletoparameteroftypestring〔〕。Typestringbooleanisnotassignabletotypestring。Typebooleanisnotassignabletotypestring。(2345)
  此错误表示,在编译时,传递给processArray的值被解释为false的数组。字符串值,这不是processArray所期望的。它需要一个字符串数组:string〔〕。
  这是TypeScript不够聪明的一种情况,无法通过使用。filter(Boolean)来推断我们正在从数组中删除所有虚假值。但是,有一种方法可以向TypeScript提供这个提示:使用用户定义的类型保护。
  创建一个名为isString的用户定义类型保护函数:functionisString(value:any):valueisstring{returntypeofvaluestring}
  注意isString函数的返回类型。创建用户定义类型保护的方法是使用以下语法作为函数的返回类型:parameterNameisType
  其中parameterName是我们正在测试的参数的名称,Type是此函数返回true时此参数值的预期类型。
  在这种情况下,如果isString返回true,则表示value是一个字符串。我们还将value参数的类型设置为any,因此,它适用于任何类型的值。
  现在,更改。filter调用以使用的新函数,而不是将其传递给布尔构造函数:constisProductionfalseconstvaluesArray〔somestring,isProductionproduction〕functionprocessArray(array:string〔〕){dosomethingwitharray}functionisString(value:any):valueisstring{returntypeofvaluestring}processArray(valuesArray。filter(isString))
  现在TypeScript编译器正确地推断出传递给processArray的数组只包含字符串,并且,我们的代码可以正确编译。
  结论
  函数是TypeScript中应用程序的构建块,在本教程中,我们学习了如何在TypeScript中构建类型安全的函数,以及如何利用函数重载来更好地记录单个函数的所有变体。拥有这些知识将允许在整个代码中使用更多类型安全且易于维护的功能。

水浒传林冲为什么叫豹子头?林冲是模仿张飞写的,而张飞豹头环眼,燕颔虎须,像豹子的头一样,林冲的相貌和他很像,所以有了ldquo;豹子头rdquo;的绰号。这一点,林冲出场时,作者也说了。那官人生的豹头环……水浒传林冲怎么死的?历史上传下来的,林冲有两种死法:一是由于宋江不让林冲杀高俅,林冲气得吐血,过了不久就病死了,简称气死。二是征方腊之后得胜回朝的过程中得了中风,留在杭州六和寺养病,半年后病故,简……吴永恩家境如何据了解,吴永恩家境还是不错的。吴永恩曾透露自己从小是在美国长大的,就读于加利福尼亚大学,是一个高材生,还在清华上了一个中文语言课程,看来吴永恩从小成绩都是非常不错。在关于……白鹿撞脸半个娱乐圈白鹿网红出身,被评撞脸半个娱乐圈艺人,比如马思纯、李一桐、刘诗诗、李沁、乔欣等等。但白鹿却霸气回应超圈粉。讲真,白鹿和谁长得像确实有很多的资讯报道,有人说她像马思纯,有人……白鹿承认了许凯是她男朋友吗没有,白鹿和许凯两人都没有官宣两人真正在一起,虽然合作过五次,但他们都当彼此是普通朋友。不过可以说两人是荧幕情侣么?毕竟两人有个多次合作,也经常饰演情侣,所以说两人是剧中情侣是……张若昀唐艺昕红绿灯什么梗张若昀唐艺昕相识于一个红绿灯路口,同时张若昀的家里面还摆着一个红绿灯装饰,这算是两人的爱情信物吧。当初两人在一个红灯路口相遇,而当时两人因为下雨天不小心导致了两人车辆发生了剐蹭……小娘惹每个人结局小娘惹每个人结局:月娘和律师保罗在一起,陈锡遭到月娘拒绝后不知所踪,玉珠嫁在精神病医院度过悲惨的一生,黄珍珠的结局是惨遭陈锡抛弃,桂花中风瘫痪生活不能自理,罗伯张为自己的恶行付……没有方向盘油门刹车!无人接驳车在京获准上路北京日报客户端记者曹政1月18日,文远知行对外披露,其无人接驳车正式获得北京市高级别自动驾驶示范区工作办公室颁发的自动驾驶路测牌照。根据许可,文远知行无人接驳车可在示范区……晁旭东牵手成功了吗(晁旭东跟谁牵手了)1。晁旭东没有牵手成功。节目《新相亲时代》晁旭东没和任何人牵手。晁旭东在节目中的表现挺惹争议的,他自身条件没那么好,要求还不少,给人的感觉有些奇葩。2。晁旭东也算是《新相……零信任,很可能将成为企业数字化转型的必要条件大白话说,云计算的本质是什么?云计算,就是你把自己的业务给实现成了软件(你管它叫信息化也行、数位化也行),然后租赁了第三方的硬件与网络资源去运行这些软件,以服务你的客户、……白敬亭出道(白敬亭出道经历)1。白敬亭出道是在2014年8月4日这一天。2014年,还在上大学的白敬亭机缘巧合出演搜狐视频周播剧《匆匆那年》,在剧中饰演男二号乔燃,这也是其首部影视作品,而白敬亭也凭借这部……白敬亭哪一年出道(白敬亭出道年月日)1。白敬亭是2014年8月4日出道的,白敬亭的出道也是比较偶然的,是被剧组选中,因为他长相阳光帅气俊朗潇洒,并且一米八三身高身材高挑挺拔,给人一眼就难忘的感觉,再加上这两年白敬……
全新10号色引领潮流美学,华为nova10系列带给你不一样的对于追求时尚的年轻人来说,一个整体的风格搭配尤为重要。手机作为一个新时代的饰品,也是彰显用户的品位,不管机身形状还是色彩搭配,都是用户比较注重的因素。尽管现在市场上手机产品百花……深度从巴塞罗那41皇家社会比赛中看到的几点罗伯特莱万多夫斯基(RobertLewandowski)在他34岁生日那天梅开二度并助攻,皇家社会1比4巴塞罗那。这是巴萨在西甲新赛季的首场胜利,安苏法蒂在下半场替补出场……东京的印度村中国城和韩国街别具特色(图)在东京江户川区的西葛西,有一个ldquo;印度村rdquo;。在日印度人,早先集中在神户东京的印度村、中国城和韩国街和神奈川县的港口从事贸易,如今聚居在西葛西。离西葛西车站走路……宇宙中最热的恒星有多热?梅西耶43位于一条尘埃带的对面,延续着巨大的星云,主要由一颗比我们自己的太阳亮数十万倍的恒星照亮。位于1000至1500光年之外,这是与猎户座主星云相同的分子云复合体的一部分。……大数据时代下,如何识别垃圾信息?编辑导语:大数据时代之下,信息繁杂多样,其中也充斥着大量的假话和谬论。怎么在纷繁复杂的信息里面,去伪存真,需要我们有一定的思辨能力,去识别信息中的垃圾信息。而如何识别辨别这些垃……西塘的宅弄宅弄深处,曲径通幽(图)宅弄是西塘的又一大特色。它能反映出西塘人的性格,宅弄深处,曲径通幽,不知深几许,行至尽头,豁然开朗,别有新洞天。弄堂按不同的用途来分类,大致有三类:街弄、陪弄和水弄。连通……电视剧新倩女幽魂什么时候上映据悉,电视剧新倩女幽魂预计2021年上映播出,该剧一共60集,其中剧情应该改动挺大的,可能会以电影的剧情为主心骨。据悉,新版《倩女幽魂》是根据《聊斋》的《聂小倩》篇所改编的,在……求德云社辈分排名怎么排的?1、德云社辈分排名怎么排的:德云社是遵循张文顺定下的【云鹤九霄、龙腾四海】辈分的,郭德纲他2年只收一个字科的徒弟,如今按辈分算,德云社的所有弟子里面辈分低的就属霄字科了,德云社……孙越带进德云社的有哪些人孙越带进德云社的原艺馨社成员有:孙越、刘喆、翟国强、邓德勇、王碧辉、王磊、王少立、孟洋、栾奕等。孙越带进德云社的有哪些人1、孙越,现为岳云鹏搭档,师承石富宽先生(一……拯救过敏人群,让我畅快呼吸米家净化器4Pro实用测评转眼之间就到了五月份,天气也暖和了不少,本以为终于能够开始好好地享受一下生活,没想到生活先给了我一个下马威。作为一个资深鼻炎患者,每年的春季都是我鼻子要过的一道坎,各种各样的花……12!卫冕冠军崩盘被绝杀,前中超主帅带队完成逆转北京时间7月25日5点,2022赛季巴甲联赛第19轮继续进行,卫冕冠军米内罗竞技坐镇主场迎战科林蒂安。全场比赛战罢,主场作战的米内罗竞技率先取得进球,但尾声阶段,科林蒂安凭借法……这张年度最牛的图亮点太多了!(组图)这张年度最牛的图亮点太多了!(组图)这张年度最牛逼的图你看出来哪里牛逼了吗亮点太多太震撼了!号称年度最牛逼的图片出现了,瞪大眼睛看看究竟是哪里牛逼呢?好吧,一眼就看……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网