缩小帽存储类型

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了缩小帽存储类型相关的知识,希望对你有一定的参考价值。

缩小帽存储分为三种类型:

DAS:直连式存储:Direct-Attached Storage,简称DAS

SAN:存储区域网络:Storage Area Network,简称SAN

NAS:网络附加存储:Network-Attached Storage,简称NAS

DAS存储:

  指存储设备直接连接到服务器总线上,存储设备只与一台独立的主机连接,其他主机不能使用这个存储设备。

存储和服务器之间的连接:
  通过scsi协议或者FC(光纤接口)这种方式来进行连接。

例如:
  家用服务器和电脑硬盘就是DAS这种类型

NAS存储:

  NAS存储也通常被称为附加存储,顾名思义,就是存储设备通过标准的网络拓扑结构(例如以太网)添加到一群计算机上。

存储和服务器的连接:
  一般基于ip网络来进行连接

SAN存储:

  通过光纤通道或以太网交换机连接存储阵列和服务器主机,最后成为一个专用的存储网络。

存储和服务器之间的连接方式:
  scsi、ip、fc都可以

SAN和NAS的文件系统区别:

区别:
  客户端应用程序是否具有对存储空间的管理权限

SAN:
  只给用户划分空间,用户自己来管理这个区域。例如指定文件系统的类型等。

NAS:
  文件系统在NSA存储上面,只给用户分配空间,用户不具备对空间的管理权限。用户的通过引用程序直接通过网络就可以访问到上面的文件
参考技术A 常见的存储类型有块存储、文件存储、对象存储等。
块存储的存储对象是磁盘阵列、硬盘等块设备;
文件存储的存储对象是文件系统;
对象存储的存储对象是服务器。
缩小帽可以直接使用即时存档。

TypeScript 类型推断/缩小挑战

【中文标题】TypeScript 类型推断/缩小挑战【英文标题】:TypeScript type inference/narrowing challenge 【发布时间】:2017-08-12 08:15:31 【问题描述】:

我目前正在尝试改进一些现有代码的类型。我的代码大致是这样的:

/* dispatcher.ts */
interface Message 
    messageType: string;


class Dispatcher<M extends Message>     
    on<
        MessageType extends M["messageType"],
        SubMessage extends M &  messageType: MessageType 
    >(
        messageType: MessageType,
        handler: (message: SubMessage) => void
    ): void  


/* messages.ts */
interface AddCommentMessage 
    messageType: "ADD_COMMENT";
    commentId: number;
    comment: string;
    userId: number;


interface PostPictureMessage 
    messageType: "POST_PICTURE";
    pictureId: number;
    userId: number;


type AppMessage = AddCommentMessage | PostPictureMessage;

/* app.ts */
const dispatcher = new Dispatcher<AppMessage>();

dispatcher.on("ADD_COMMENT", (message: AddCommentMessage ) => 
                                    /* ^^ REMOVE THIS TYPE HINT!*/
    console.log(message.comment);
);

我想消除显式缩小传递给消息处理程序的消息类型(/*REMOVE THIS TYPE HINT!*/ 是)的需要,以便它正确地缩小到具有匹配 messageType 类型的类型(例如如果messageType"ADD_COMMENT" 那么message 应该是AddCommentMessage)。

如果现在无法做到这一点,请告诉我。我的印象是不是,但我不太确定。

【问题讨论】:

欢迎来到 Stack Overflow!请在问题本身的minimal reproducible example 中提供所有相关代码,而不仅仅是在第三方网站上。 【参考方案1】:

这是不可能的,除非你愿意修改代码。

你的基本界面

interface Message 
    messageType: string;

太笼统了,我认为messageType: string 排除了基于messageType 的值的任何推断,并且看起来不可能在Dispatcher 接口中充分缩小它。

如果您将代码限制为仅AppMessage 及其后代,这里是一个示例,如何制作 typescript 以根据字符串文字类型推断您需要的类型(keyof AppMessageMap 实际上是字符串文字类型的联合 @ 987654327@):

/* dispatcher.ts */

class Dispatcher     
    on<
        MessageType extends keyof AppMessageMap
    >(
        messageType: MessageType,
        handler: (message: AppMessageMap[MessageType] & messageType: MessageType) => void
    ): void  


/* messages.ts */
interface AddCommentMessage 
    commentId: number;
    comment: string;
    userId: number;


interface PostPictureMessage 
    pictureId: number;
    userId: number;


interface AppMessageMap 
    "ADD_COMMENT": AddCommentMessage,
    "POST_PICTURE": PostPictureMessage

type AppMessage = AppMessageMap[keyof AppMessageMap];

/* app.ts */
const dispatcher = new Dispatcher();


dispatcher.on("ADD_COMMENT", (message) => 
    console.log(message.comment);
);

我还从接口中删除了messageType属性以避免重复,我认为handler参数中的交集类型可以达到相同的效果。

【讨论】:

这是完美的答案,非常感谢。 TypeScript 类型系统的强大总是让我大吃一惊。我唯一改变的是使Dispatcher 通用,以便AppMessageMap 作为类型参数传递(我对同一代码库中的多个应用程序使用相同的Dispatcher)。

以上是关于缩小帽存储类型的主要内容,如果未能解决你的问题,请参考以下文章

ruby 优化和缩小您的GIT存储库(Ruby脚本)。来自Jeff Smith @ rallydev.com。

sh 此脚本将帮助您从git repo历史记录中删除大文件,并缩小存储库的大小。

ARM体系结构与编程-第五章

firebase 存储 cors 奇怪的行为

C语言速记3(作用域,枚举)

如何在本地缩小远程.git文件夹后更新它