缩小帽存储类型
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。