TypeScript 程序员晋级的 11 个必备技巧_世界微资讯

2023-04-21 14:02:57 来源: 前端新世界

当你学习TypeScript时,你的第一印象可能会欺骗你:这不就是JavaScript注解的一种方式吗?不就是编译器用来帮助我找到潜在bug的吗?

虽然这种说法没错,但随着你对TypeScript不断了解,你会发现这门编程语言最不可思议的力量在于编写、推断和操作数据类型。


(资料图片仅供参考)

本文总结的一些技巧,可以帮助大家充分发挥TypeScript的潜力。

#1 用集合的概念思考问题

数据类型是程序员日常要处理的概念,但要简洁地定义它却出奇地困难。然而我发现集合非常适合用作概念模型。

刚开始学习TypeScript时,我们常常会发现用TypeScript编写类型的方式很不自然。举一个非常简单的例子:

type Measure = { radius: number };type Style = { color: string };// typed { radius: number; color: string }type Circle = Measure & Style;

如果你在逻辑AND的意义上解释运算符&,可能会认为Circle是一个虚拟类型,因为它是两种类型的结合,没有任何重叠的字段。这不是TypeScript的工作方式。此时通过集合的概念思考更容易推断出正确的行为:

每个类型都是一系列值的集合。有些集合是无限的:例如string、object;有些是有限的:例如bool,undefined,...unknown​是通用集(包括所有值),而never是空集(包括无值)。类型Measure是包含radius数字字段的所有对象的集合。style也是如此。&​运算符创建一个交集:Measure & Style表示包含radius和color的对象集,这实际上是一个较小的集合,字段更常用。同理,|运算符创建一个并集:一个较大的集合,但常用字段可能较少(如果组合两个对象类型的话)。

集合还有助于了解可分配性:仅当值的类型是目标类型的子集时,才允许赋值:

type ShapeKind = "rect" | "circle";let foo: string = getSomeString();let shape: ShapeKind = "rect";// disallowed because string is not subset of ShapeKindshape = foo;// allowed because ShapeKind is subset of stringfoo = shape;
#2 了解声明类型和收窄类型

TypeScript中一个非常强大的功能是基于控制流的自动类型收窄。这意味着变量在代码位置的任何特定点都有两种与之关联的类型:声明类型和收窄类型。

function foo(x: string | number) {  if (typeof x === "string") {    // x"s type is narrowed to string, so .length is valid    console.log(x.length);    // assignment respects declaration type, not narrowed type    x = 1;    console.log(x.length); // disallowed because x is now number  } else {    ...  }}
#3 使用可区分的联合类型而不是可选字段

当定义一组多态类型(如Shape)时,很容易这样开始写代码:

type Shape = {  kind: "circle" | "rect";  radius?: number;  width?: number;  height?: number;}function getArea(shape: Shape) {  return shape.kind === "circle" ?     Math.PI * shape.radius! ** 2    : shape.width! * shape.height!;}

需要非空断言(访问radius、width和height​时),因为kind和其他字段之间没有建立关系。相反,可区分的联合类型是一个更好的解决方案:

type Circle = { kind: "circle"; radius: number };type Rect = { kind: "rect"; width: number; height: number };type Shape = Circle | Rect;function getArea(shape: Shape) {    return shape.kind === "circle" ?         Math.PI * shape.radius ** 2        : shape.width * shape.height;}

从以上代码可以看出,类型收窄消除了强制类型转换的需要。

#4 使用类型谓词避免类型断言

如果你以正确的方式使用TypeScript的话,你会发现自己很少使用显式类型断言(比如value as SomeType);但是,有时你可能会冲动地写出诸如这样的代码:

type Circle = { kind: "circle"; radius: number };type Rect = { kind: "rect"; width: number; height: number };type Shape = Circle | Rect;function isCircle(shape: Shape) {  return shape.kind === "circle";}function isRect(shape: Shape) {  return shape.kind === "rect";}const myShapes: Shape[] = getShapes();// error because typescript doesn"t know the filtering// narrows typingconst circles: Circle[] = myShapes.filter(isCircle);// you may be inclined to add an assertion:// const circles = myShapes.filter(isCircle) as Circle[];

更优雅的解决方案是将isCircle和isRect​更改为返回类型谓词,这样就可以帮助TypeScript在filter调用后进一步收窄类型:

function isCircle(shape: Shape): shape is Circle {    return shape.kind === "circle";}function isRect(shape: Shape): shape is Rect {    return shape.kind === "rect";}...// now you get Circle[] type inferred correctlyconst circles = myShapes.filter(isCircle);
#5 控制联合类型的分布方式

类型推断是TypeScript的特性;大多数时候,它默默地为你工作。但是有时你可能对模棱两可的细微情况进行干预。分布式条件类型就是其中一种情况。

假设我们有一个ToArray辅助类,如果输入类型还不是数组类型,则返回数组类型:

type ToArray = T extends Array ? T: T[];

你认为以下类型会推断出什么?

type Foo = ToArray;

答案是string[] | number[]​。但这是模棱两可的。为什么不是(string | number)[]呢?

默认情况下,当TypeScript遇到联合类型(此处为string | number​)的泛型参数(此处为T​)时,它会分布到每个组成部分中,这就是为什么会得到string[] | number[]​的原因。你可以通过使用特殊语法并将T​包装在一对[]中来更改此行为,例如:

type ToArray = [T] extends [Array] ? T : T[];type Foo = ToArray;

现在Foo​被推断为类型(string | number)[]。

#6 使用详尽检查捕获在编译时未处理的情况

在switch​语句中使用enum枚举时,一个好习惯是在没有匹配到合适值的情况下主动抛错,而不是像在其他编程语言中那样默默地忽略它们:

function getArea(shape: Shape) {  switch (shape.kind) {    case "circle":      return Math.PI * shape.radius ** 2;    case "rect":      return shape.width * shape.height;    default:      throw new Error("Unknown shape kind");  }}

通过使用never类型,静态类型检查就可以更早地查找到错误:

function getArea(shape: Shape) {  switch (shape.kind) {    case "circle":      return Math.PI * shape.radius ** 2;    case "rect":      return shape.width * shape.height;    default:      // you"ll get a type-checking error below                // if any shape.kind is not handled above      const _exhaustiveCheck: never = shape;      throw new Error("Unknown shape kind");  }}

有了这个,在添加新的shape​种类时,就不可能忘记更新getArea函数。

该技术背后的基本原理是,除了never​之外,不能为never​类型分配任何内容。如果shape.kind​的所有备选项都被case​语句用尽,那么达到default​的唯一可能类型是never​;但是,如果未涵盖所有备选项,则将泄漏到default分支并导致无效分配。

#7 宁可使用type而不是interface

在TypeScript中,type和interface​是两种非常相似的数据结构,都可以用来构造复杂的对象的。虽然可能有争议,但我的建议是在大多数情况下始终使用type,仅在满足以下任一条件时才使用interface:

想利用interface的合并功能。有涉及类/接口层次结构的OO样式代码。

否则,始终使用更通用的type构造会产生更一致的代码。

#8 只要合适宁可使用元组而不是数组

对象类型是构造结构化数据的常用方法,但有时你可能希望使用更简洁的表示形式,而改用简单的数组。例如,Circle可以定义为:

type Circle = (string | number)[];const circle: Circle = ["circle", 1.0];  // [kind, radius]

但是这种构造是松散的,如果创建类似["circle", "1.0"]的内容很容易出错。我们可以通过使用元组来使其更严格:

type Circle = [string, number];// you"ll get an error belowconst circle: Circle = ["circle", "1.0"];

使用元组的一个很好的例子是React中的useState。

const [name, setName] = useState("");

既紧凑又类型安全。

#9 控制推断类型的通用性或特殊性

TypeScript在进行类型推断时使用合理的默认行为,旨在使常见情况下的代码编写变得容易(因此类型不需要显式注释)。有几种方法可以调整其行为。

使用const缩小到最具体的类型
let foo = { name: "foo" }; // typed: { name: string }let Bar = { name: "bar" } as const; // typed: { name: "bar" }let a = [1, 2]; // typed: number[]let b = [1, 2] as const; // typed: [1, 2]// typed { kind: "circle; radius: number }let circle = { kind: "circle" as const, radius: 1.0 };// the following won"t work if circle wasn"t initialized// with the const keywordlet shape: { kind: "circle" | "rect" } = circle;
使用satisfies来检查类型,而不影响推断的类型

请看以下示例:

type NamedCircle = {    radius: number;    name?: string;};const circle: NamedCircle = { radius: 1.0, name: "yeah" };// error because circle.name can be undefinedconsole.log(circle.name.length);

有个错误,这是因为根据circle​的声明类型NamedCircle,name​字段确实可以未定义,即使变量初始值设定项提供了字符串值。当然,我们可以删除:NamedCircle​类型注释,但这将松散对circle对象有效性的类型检查。进退两难。

幸运的是,Typescript 4.9引入了一个新的satisfies关键字,它允许你在不更改推断类型的情况下检查类型:

type NamedCircle = {    radius: number;    name?: string;};// error because radius violates NamedCircleconst wrongCircle = { radius: "1.0", name: "ha" }    satisfies NamedCircle;const circle = { radius: 1.0, name: "yeah" }    satisfies NamedCircle;// circle.name can"t be undefined nowconsole.log(circle.name.length);

修改后的版本具有两个优点:对象字面量保证符合NamedCircle类型,推断类型具有不可为空的名称字段。

#10 使用infer创建额外的泛型类型参数

在设计实用工具函数和类型时,你经常会觉得需要使用从给定类型参数中提取的类型。在这种情况下,infer关键字就可以派上用场。它可以帮助快速推断新的类型参数。下面是两个简单的例子:

// gets the unwrapped type out of a Promise;// idempotent if T is not Promisetype ResolvedPromise = T extends Promise ? U : T;type t = ResolvedPromise>; // t: string// gets the flattened type of array T;// idempotent if T is not arraytype Flatten = T extends Array ? Flatten : T;type e = Flatten; // e: number

infer​关键字在T extends Promise​中的工作原理可以理解为:假设T​与一些实例化的泛型Promise类型兼容,临时凑合一个类型参数U​以使其工作。因此,如果T​被实例化为Promise​,则U​的解决方案将是string。

#11 创新类型操作以保持DRY

TypeScript提供了强大的类型操作语法和一组非常有用的实用程序,可帮助你将代码重复减少到最低限度。以下是一些简单示例:

与其重复字段声明:

type User = {    age: number;    gender: string;    country: string;    city: string};type Demographic = { age: number: gender: string; };type Geo = { country: string; city: string; };

还不如使用pick实用程序提取新类型:

type User = {    age: number;    gender: string;    country: string;    city: string};type Demographic = Pick;type Geo = Pick;

与其复制函数的返回类型:

function createCircle() {    return {        kind: "circle" as const,        radius: 1.0    }}function transformCircle(circle: { kind: "circle"; radius: number }) {    ...}transformCircle(createCircle());

还不如使用ReturnType提取:

function createCircle() {    return {        kind: "circle" as const,        radius: 1.0    }}function transformCircle(circle: ReturnType) {    ...}transformCircle(createCircle());

与其并行同步两种类型的shape​(此处为config​类型和Factory):

type ContentTypes = "news" | "blog" | "video";// config for indicating what content types are enabledconst config = { news: true, blog: true, video: false }    satisfies Record;// factory for creating contentstype Factory = {    createNews: () => Content;    createBlog: () => Content;};

还不如使用映射类型和模板字面量类型根据config​的形状自动推断正确的factory类型:

type ContentTypes = "news" | "blog" | "video";// generic factory type with a inferred list of methods// based on the shape of the given Configtype ContentFactory> = {    [k in string & keyof Config as Config[k] extends true        ? `create${Capitalize}`        : never]: () => Content;};// config for indicating what content types are enabledconst config = { news: true, blog: true, video: false }    satisfies Record;type Factory = ContentFactory;// Factory: {//     createNews: () => Content;//     createBlog: () => Content; // }
总结

这篇文章介绍了一系列TypeScript语言的高级应用。在实践中,你可能会发现直接这样用并不常见;但是,这些技术被大量用于那些专门为TypeScript而设计的库:如Prisma和tRPC。了解这些技巧可以帮助你更好地理解这些工具是发挥其威力的。

标签:

上一篇 :

下一篇 :

TypeScript 程序员晋级的 11 个必备技巧_世界微资讯

当你学习TypeScript时,你的第一印象可能会欺骗你:这不就是JavaScript注解的一种方式吗?不就是编译器...

04-21 14:02:57

当前报道:“院士科学家来我们学校作报告了”

中国教育报-中国教育新闻网讯(记者冯丽通讯员李彧)“院士科学家来我们学校作报告了!”日前,中国科学...

04-21 13:16:36

规范服务行为 工信部将加强APP全链条治理

工信部总工程师赵志国在20日举行的国新办发布会上表示,工信部将加强APP全链条治理,规范软件安装卸载、...

04-21 13:01:26

前沿资讯!北京互联网法院:数字教育著作权纠纷案件收案量增幅明显 新型侵权行为不断涌现

原标题:北京互联网法院:数字教育著作权纠纷案件收案量增幅明显新型侵权行为不断涌现为加强著作权司法...

04-21 12:02:44

锦西石化催化烟机运行创最高水平 快讯

中国石油网消息(记者李杨通讯员王春红)截至4月18日,锦西石化公司催化烟机累计运行2 1264万小时,超...

04-21 11:46:13

全球热资讯!人民日报仲音:以学铸魂,铸牢对党忠诚

原标题:以学铸魂,铸牢对党忠诚——推动主题教育取得实实在在的成效忠诚印寸心,浩然充两间。不久前,...

04-21 11:24:17

有线电视机顶盒怎么装_数字电视机顶盒的安装方法

欢迎观看本篇文章,小勉来为大家解答以上问题。有线电视机顶盒怎么装,数字电视机顶盒的安装方法很多人...

04-21 11:07:18

琼斯:蒂尔曼对我们很重要 他也是我们赢球的重要原因 天天速递

NBA季后赛首轮G2,灰熊主场103-93力克湖人,系列赛比分扳至1-1。赛后灰熊后卫泰厄斯-琼斯接受了媒体采访...

04-21 10:47:52

北京长峰医院火灾系内部改造施工作业引发 全球百事通

00:27新华社北京4月19日电(记者吴文诩)记者19日从北京市人民政府新闻办举行的长峰医院火灾事故情况通...

04-21 10:28:09

全球微头条丨农村信用社改名农商行后,利率高达到3.4%,存10万可赚一万多利息

农村信用社改名农商行后,利率高达到3 4%,存10万可赚一万多利息,存款,农商行,农商银行,收入证明,农村...

04-21 10:17:48

每日快播:国机通用(600444):国机通用关于2022年度业绩说明会召开情况

证券代码:600444证券简称:国机通用公告编号:2023-008国机通用机械科技股份有限公司关于2022年度业绩说明会召

04-21 10:09:56

环球新消息丨虎娘日报:MSI抽签仪式时间宣布 Ming透露新中路选手消息

最近RNG给了粉丝们很震惊的消息,就是Angel和Xiaobai两名选手的官宣离队,这对于本来状态就下滑的RNG而...

04-21 09:35:02

中牟县韩寺镇“三个到位”推进人居环境整治全域提升

4月份以来,中牟县韩寺镇迅速行动、周密部署,按照“党委政府部署—站所机关干部带头—村党支部负责”的...

04-21 09:02:03

欧元区3月CPI终值同比增长6.90%,符合市场预期 今日关注

金融界4月19日消息欧元区3月CPI终值同比增长6 90%,预期6 90%,前值6 90%;3月CPI环比增长0 9%

04-21 08:46:38

今年最火的鞋子,时髦的人都在穿! 环球播报

今年最火的鞋子,时髦的人都在穿!,裙子,短裙,鞋子,牛仔裤,碎花裙,阔腿裤,复古风,玛丽珍,香奈儿,青春活力

04-21 08:46:14

每日热文:显示屏不亮是什么原因

1、接个耳机听下看有没有开机进入windows的声音最有可能是主板挂了,它通电了,但不工作第二种显卡挂了内...

04-21 07:57:08

excel表格数字自动加小数点_excel表格数字自动加1

1、先输入选项和题目如图2、按住alt+F11,出现如下窗口3、打开代码窗口,把如下代码复制进去PrivateSub

04-21 07:46:18

环球短讯!物流企业管理模式有哪些_企业管理模式有哪些

1、亲情化管理模式这种管理模式利用家族血缘关系中的一个很重要的功能,即内聚功能,也就是试图通过家族...

04-21 06:53:10

快资讯:消费潜力仍然巨大 业界热议零售业发展趋势

人民网北京4月20日电(记者乔雪峰)“2022年在面对国内外多重超预期因素影响下,我国消费潜力仍然巨大,超...

04-21 06:46:24

康桂梅

1、康桂梅,祖籍内蒙。毕业于中国重彩岩彩高级研究班。分别研修于中央美院、北京画院、自由画家,现居中...

04-21 06:30:16

小店街道:“党建红”助力老旧小区向“新”而生

抓党建促基层治理能力提升专项行动开展以来,太原小店区小店街道康宁街社区以“融入式党建”为引领,不...

04-21 06:30:27

清飞絮、除隐患,李营街道培文社区开展保安全宣传活动|天天热推荐

近日,济宁市任城区李营街道培文社区联合物业工作人员开展“清飞絮除隐患保安全”宣传活动,对辖区内的...

04-21 05:36:27

长沙县委常委、县委组织部部长陶建军在湖南机电职院考察调研-环球信息

4月17日,长沙县委常委、县委组织部部长陶建军一行在湖南机电职院考察调研大学生创新创业工作。该校党委...

04-21 05:30:26

从知识面到应试技巧,注册会计师备考经验分享

作为一名已经取得注册会计师资格的人员,我想分享一下我在备考过程中的经验和心得。在备考过程中,我主...

04-21 05:00:10

宝马MINI被指区别对待,官方致歉

20日下午,@MINI中国就冰激凌事件致歉:MINI发起的“上海车展现场礼-甜宠”活动本意是给逛展的大小朋友...

04-21 04:35:09

天天微速讯:@全省7.7万考生,这项考试4月22日开考!考前注意→

本周六,我省2023年普通高校专升本考试就要举行。本次全省共7 7万考生参加,考前需要准备和注意些什么...

04-21 04:28:34

《墨影侠踪》评测7.3分 江湖除了打打杀杀,还有疑案追凶_环球简讯

明朝初年,天下初定,朝堂风云变幻,江湖纷争不断。而你是一名自小就隐居于山林间的临渊阁弟子,从师傅...

04-21 04:21:53

继续布局网安赛道 奇安二期网安基金完成最终关闭 信息

新京报贝壳财经讯(记者罗亦丹)日前,专注于网安行业的专业投资机构奇安投资宣布完成二期网安产业基金...

04-21 04:20:36

世界热讯:海外华媒参访团探访中国大熊猫保护研究中心雅安基地

海外华媒参访团探访中国大熊猫保护研究中心雅安基地华文媒体代表拍摄大熊猫科普展板。王磊摄华文媒体代...

04-21 03:02:46

外媒:美军军车在德国高速公路上出车祸,至少7名军人受伤-环球热头条

参考消息网4月19日报道据美国《军队时报》网站4月18日报道,美国军方官员证实,当地时间17日上午,美军...

04-21 02:51:03

全信股份:公司航空航天用高性能线缆及轨道交通用数据线缆项目产能建设正在有序进行中|微资讯

全信股份(300447)04月20日在投资者关系平台上答复了投资者关心的问题。

04-21 02:34:41

世界速看:桃源深处有人家烟花如何做 桃源深处有人家烟花制作攻略

相信有不少的玩家喜欢玩桃源深处有人家这个游戏,事实上,这个游戏在近期新出了放烟花这个互动玩法。但...

04-21 02:37:14

金砖创新基地标准化与知识产权系列培训(自贸区专场)举办_全球球精选

中国企业出海,如何满足目标市场的技术标准,跨过“标准”这道门槛?中国企业如何与金砖国家的企业家们...

04-21 01:13:51

常长亭:华工科技是典型成长股代表之一 当前聚焦

常长亭:华工科技是典型成长股代表之一个人观点仅供参考据此买卖自担风险【温馨提示】劝新老股民,量力...

04-21 01:13:54

四川大学文物与博物馆学考研_四川大学文学院 当前快讯

1、还比较好吧 最好的专业是比较文学与世界文学 古典文献学,古代文学也不错,都是国家重点学科 老师实...

04-21 00:56:32

星舰发射任务失败

SpaceX:星舰的试飞似乎还不够令人满意,星舰飞船发生了非计划内的解体。团队将继续审查数据并为我们的...

04-21 00:39:04

电报解读|宁德时代(300750.SZ)市占率继续提升,产能继续高速扩张,麒麟、钠电池、钙钛矿电池等多技术路线布局顺利推进

精品VIP投研内容

04-21 00:13:31

海云轩能升值涨价吗,万宁新房的价值洼地是哪个地方~

海云轩能升值涨价吗,万宁新房的价值洼地是哪个地方,海云轩房价及配套分析,海云轩楼盘详情及售楼电话...

04-20 23:30:33

高天红:基金业协会将持续深化放管服改革

【高天红:基金业协会将持续深化放管服改革】4月20日,第七届2023年全球私募基金西湖峰会在杭州召开。中...

04-20 23:31:59

韧性向上,国民奶茶香飘飘的长期主义

作者|twelve夜财经数据支持|勾股大数据(www gogudata com)回望过去的2022年,受制于多重因素影响,...

04-20 22:52:20

安吉丽娜·朱莉&哈里·贝瑞将合作主演《茂德大战茂德》 罗丝安妮·梁执导

《茂德大战茂德》由新西兰华裔女导演罗丝安妮·梁(RoseanneLiang)执导,编剧是ScottMosier。

04-20 22:17:21

真空热处理器多少钱_真空热处理技术

1、《真空热处理技术》是2015年化学工业出版社出版的图书,作者是王忠诚。2、。本文到此结束,希望对大...

04-20 21:50:49

报告:2022年中国40家上市银行净利润同比增6.96%

普华永道中国北方区金融业主管合伙人朱宇当日表示,2022年上市银行净利润增速回落,盈利能力保持平稳。...

04-20 21:43:32

每日快看:交易异动!焦点科技:近3个交易日上涨16.65% 无未披露的重大事项

焦点科技(SZ002315,收盘价:27 6元)4月19日晚间发布公告称,焦点科技股份有限公司股票交易价格连续...

04-20 21:20:41

当日快讯:港股新能源汽车股大跌,小鹏汽车跌超6% 环球百事通

4月20日上午,港股新能源汽车股大跌,小鹏汽车跌超6%,蔚来跌超4%,理想汽车跌近3%,零跑汽车、长城汽车...

04-20 21:13:56

《尘封十三载》曲振祥是好人吗 曲振祥结局是什么?_全球快消息

曲振祥从小受人欺负,心里一直想着有一天能够出人头地,就是为了能够取那些人而代之。在出事之后,曲振...

04-20 21:10:52

黑龙江省四大新引擎产业“政校企”技能人才培养联盟启动仪式举行

中新网黑龙江新闻4月20日电(记者王妮娜)4月20日,黑龙江省数字经济、生物经济、冰雪经济、创意设计四大...

04-20 20:08:34

天天热头条丨形容凝聚力和团队精神的句子(凝聚力和团队精神的句子)

1、失败的团队没有成功者,成功的团队成就每一个人!凝聚团队,聚焦目标,为梦想创造无限可能。2、2、不管努...

04-20 19:57:23

【环球报资讯】王菲现身机场,小腹隆起被疑怀孕,频繁穿同件衣服被赞勤俭持家

经过网友考证后得知,女神所穿的这件风衣不到千元,被网友偶遇当天,王菲还手拿一个价值不到30元的黄色...

04-20 19:28:26

卓锦股份:公司目前暂无海水淡化相关技术|世界观点

卓锦股份:公司目前暂无海水淡化相关技术

04-20 19:25:59

当前报道:“院士科学家来我们学校作报告了”
规范服务行为 工信部将加强APP全链条治理
前沿资讯!北京互联网法院:数字教育著作权纠纷案件收案量增幅明显 新型侵权行为不断涌现
锦西石化催化烟机运行创最高水平 快讯
全球热资讯!人民日报仲音:以学铸魂,铸牢对党忠诚
有线电视机顶盒怎么装_数字电视机顶盒的安装方法
琼斯:蒂尔曼对我们很重要 他也是我们赢球的重要原因 天天速递
北京长峰医院火灾系内部改造施工作业引发 全球百事通
全球微头条丨农村信用社改名农商行后,利率高达到3.4%,存10万可赚一万多利息
每日快播:国机通用(600444):国机通用关于2022年度业绩说明会召开情况
环球新消息丨虎娘日报:MSI抽签仪式时间宣布 Ming透露新中路选手消息
中牟县韩寺镇“三个到位”推进人居环境整治全域提升
欧元区3月CPI终值同比增长6.90%,符合市场预期 今日关注
今年最火的鞋子,时髦的人都在穿! 环球播报
每日热文:显示屏不亮是什么原因
excel表格数字自动加小数点_excel表格数字自动加1
环球短讯!物流企业管理模式有哪些_企业管理模式有哪些
快资讯:消费潜力仍然巨大 业界热议零售业发展趋势
康桂梅
小店街道:“党建红”助力老旧小区向“新”而生
清飞絮、除隐患,李营街道培文社区开展保安全宣传活动|天天热推荐
长沙县委常委、县委组织部部长陶建军在湖南机电职院考察调研-环球信息
从知识面到应试技巧,注册会计师备考经验分享
宝马MINI被指区别对待,官方致歉
天天微速讯:@全省7.7万考生,这项考试4月22日开考!考前注意→
《墨影侠踪》评测7.3分 江湖除了打打杀杀,还有疑案追凶_环球简讯
继续布局网安赛道 奇安二期网安基金完成最终关闭 信息
世界热讯:海外华媒参访团探访中国大熊猫保护研究中心雅安基地
外媒:美军军车在德国高速公路上出车祸,至少7名军人受伤-环球热头条
全信股份:公司航空航天用高性能线缆及轨道交通用数据线缆项目产能建设正在有序进行中|微资讯
世界速看:桃源深处有人家烟花如何做 桃源深处有人家烟花制作攻略
金砖创新基地标准化与知识产权系列培训(自贸区专场)举办_全球球精选
常长亭:华工科技是典型成长股代表之一 当前聚焦
四川大学文物与博物馆学考研_四川大学文学院 当前快讯
星舰发射任务失败
电报解读|宁德时代(300750.SZ)市占率继续提升,产能继续高速扩张,麒麟、钠电池、钙钛矿电池等多技术路线布局顺利推进
海云轩能升值涨价吗,万宁新房的价值洼地是哪个地方~
高天红:基金业协会将持续深化放管服改革
韧性向上,国民奶茶香飘飘的长期主义
安吉丽娜·朱莉&哈里·贝瑞将合作主演《茂德大战茂德》 罗丝安妮·梁执导
真空热处理器多少钱_真空热处理技术
报告:2022年中国40家上市银行净利润同比增6.96%
每日快看:交易异动!焦点科技:近3个交易日上涨16.65% 无未披露的重大事项
当日快讯:港股新能源汽车股大跌,小鹏汽车跌超6% 环球百事通
《尘封十三载》曲振祥是好人吗 曲振祥结局是什么?_全球快消息
黑龙江省四大新引擎产业“政校企”技能人才培养联盟启动仪式举行
天天热头条丨形容凝聚力和团队精神的句子(凝聚力和团队精神的句子)
【环球报资讯】王菲现身机场,小腹隆起被疑怀孕,频繁穿同件衣服被赞勤俭持家
卓锦股份:公司目前暂无海水淡化相关技术|世界观点
国家“海洋公报”发布:9.5万亿元里的青岛担当和机遇
X 广告
资讯
X 广告

Copyright ©  2015-2022 亚太畜牧网版权所有  备案号:沪ICP备2020036824号-11   联系邮箱: 562 66 29@qq.com