在 Typescript 中,我可以创建强制需要属性的映射类型吗?

2024-01-13

在 Typescript 中,我们有映射类型,可以将属性从一种类型映射到另一种类型。

一个常见的示例是 Partial 类型,它使泛型类型上的所有属性都成为“可选”。

我想实现相反的效果,比如“必需”,其中所有属性都被设置为“必需”,而不管它们预先的可选性如何。

这样的事可能吗?

(既然知道我的问题很肤浅,请参阅更新!)

Update:

一些背景...

我正在学习映射类型,并受到文档的启发here https://www.typescriptlang.org/docs/handbook/advanced-types.html

type Proxy<T> = {
    get(): T;
    set(value: T): void;
}
type Proxify<T> = {
    [P in keyof T]: Proxy<T[P]>;
}
function proxify<T>(o: T): Proxify<T> {
   // ... wrap proxies ...
}
let proxyProps = proxify(props);

我心里想,嗯,“我想知道我们能用这个来搞什么恶作剧?”

所以我写了类似的东西:

type ProxyObservable<T> = Observable<T> & {
  [P in keyof T]: ProxyObservable<T[P]>;
};

这很酷,因为你可以给它一个这样的类型:

  interface Foo {
    myNum: number;
    myString: string;
    myObject: {
      someValue: number;
      anotherValue: Date;
    };
  }

你会得到一个ProxyObservable<Foo>type,其中每个属性都是相同类型的 Observable,而且还具有与子属性(也是 Observable)匹配的导航属性。

const foo: ProxyObservable<Foo> = Proxify<Foo>(...)
foo.myNum.subscribe(...)
foo.myObject.subscribe(...)
foo.myObject.someValue.subscribe(...)

邪恶,我知道。但很酷。

当您将属性(例如 myObject)设为可选时,有趣的问题就出现了。然后 Typescript 将中断:

foo.myObject.someValue.subscribe(...)

因为它无法辨别与 Observable 联合的类型是“未定义”还是我们定义的对象。这就是我的问题出现的地方。

但是...我现在还发现这不是“可选”属性的问题,而是一般可区分联合类型的问题。

我意识到,给定正确的上下文,Typescript 或许能够推断出foo.myObject财产。我尝试了一些变化:

foo.myObject!.someValue //<- Nope
foo.myObject ? foo.myObject.someValue : ... //<- Nope
if(foo.myObject) foo.myObject.someValue //<- Nope

在我看来,Typescript 编译器应该能够推断出这一点!

谁能告诉我为什么不呢?


现在这是可能的,并且内置于 TypeScript 中Required从 TypeScript 2.8 开始输入。

http://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-8.html http://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-8.html

这是它的定义:

/**
 * Make all properties in T required
 */
type Required<T> = {
    [P in keyof T]-?: T[P];
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Typescript 中,我可以创建强制需要属性的映射类型吗? 的相关文章

随机推荐

  • Google Chrome 与 Nodejs (v8) 的性能比较?

    Example console time Test for var i 0 i lt 2500000 i 1 loop around console timeEnd Test 上面的代码运行faster in nodejs than goo
  • Ruby 正则表达式:负匹配

    我想知道是否可以对整个单词使用否定匹配 这样就像 em lt em gt 会匹配一切 但之间 并包括 之间的文本 em em 我正在考虑使用负向前瞻 但我认为这不会起作用 因为我需要检查开口 em 以及 当然 我可以只使用正则表达式 然后从
  • Java:委托模式和受保护的方法

    我一直在使用委托模式将工厂创建的对象包装在第三方库中 最近 该库在基类中添加了受保护的方法 而我的包装类不再起作用 有没有人有一个好的解决方案而不诉诸反思 这是在第 3 方库及其包中 public class Base public voi
  • 通过扩展程序更改 Google chrome 主页

    无论如何 是否可以通过扩展程序更改 google chrome 主页 url 我正在尝试编写一个可以更改主页网址的简单扩展 希望你能帮我 这是可能的 快速搜索就会发现这样的扩展已经存在 https chrome google com web
  • xml2csv包错误'_IterParseIterator'对象没有属性'next'

    我正在使用 xmlutils 包将 xml 文件转换为 csv 我的代码如下 from xmlutils xml2csv import xml2csv as x input path media ishan Local Disk doc x
  • 线性回归中使用的显式公式

    我有一个公式列表 我使用lapply and lm创建回归模型列表 然而 当我看到call每个线性模型的组成部分 我看到的不是显式公式 而是解析到线性模型中的变量的名称 例如 使用 mtcars 数据集 temp formula list
  • dlib (setup.py) 循环的构建轮子

    尝试从 Ubuntu 安装 dlib 和face recognition 参考自https www learnopencv com install dlib on ubuntu https www learnopencv com insta
  • 为什么 Win32 API 中不使用标准数据类型? [复制]

    这个问题在这里已经有答案了 我学习 Visual C Win32 编程已经有一段时间了 为什么会有这样的数据类型DWORD WCHAR UINT等等用来代替 比如说 unsigned long char unsigned int等等 我必须
  • 使用 TypeScript React prop 类型 - 如何拥有函数类型?

    是否有使用 TypeScript 来使用 React prop types 的函数类型的最佳实践 我以为这会起作用 但实际上它出错了 type Props onClick Function const Submit onClick Prop
  • 什么时候应该使用类,什么时候应该使用函数?

    什么时候类比函数更有用 有什么我应该知道的硬性或快速规则吗 它依赖于语言吗 我打算为 Python 编写一个脚本来解析不同类型的 json 数据 我的直觉是我应该使用类来完成此操作 而不是使用函数 当您的例程需要保存状态时 您应该使用类 否
  • 如何在linux(ubuntu)上更新ruby?

    我是 ruby 和 linux 的新手 所以我确信这是微不足道的 但我还不知道 我目前安装了 ruby 1 8 7 我想将其更新到 ruby 1 9 我怎样才能做到这一点 sudo apt get install ruby1 9 应该可以解
  • 将地图标记设置为自定义颜色 Android

    我正在制作一个应用程序 可以在地图的某些点添加图钉 我希望我的图钉颜色与我们应用程序的主题颜色相匹配 抱歉我真的是菜鸟 int color Color rgb 255 201 14 mMap MapFragment getFragmentM
  • 如何解决由内联命名空间中的标识符冲突引起的不明确引用

    考虑以下代码 include
  • git 存档与 cp -R

    如果我有一个 git 存储库的克隆作为远程服务器上的缓存副本用于 capistrano vlad 样式部署 那么最好执行 A git archive format tar origin master cd destination tar x
  • TortoiseHg - 如何在不先提交的情况下创建补丁

    当我想从未提交的更改创建补丁时 我真的必须首先提交吗 TortoiseHg 是否不允许在不执行提交的情况下创建补丁 TortoiseHg 2 0 2 在工作台中 您可以右键单击Working Directory行并选择Export Copy
  • R可以画图吗?

    我想知道 R 中是否有任何包可以使用 x y 坐标和形状大小来绘制如下内容 我有车辆前中心的坐标及其尺寸 长度和宽度 Edit 原始数据集如下所示 gt head df Vehicle ID Frame ID Global X Global
  • 使用drawInRect时UIImage Aspect Fill?

    我尝试像内容模式一样绘制scaleAspectFill 我找到了如何使用 AVFoundation 制作 sacelAspectFit 但我找不到scaleAspectFill 如果我绘制水平图像 我不知道 x 值 image draw i
  • 检查 php 中是否存在 url [重复]

    这个问题在这里已经有答案了 if file exists http example com images thumbnail 1286954822 jpg filefound 0 为什么这不起作用 if file exists http e
  • Raspberry Pi 的 QTMultimedia 编译

    我只需要从 Raspberry Pi 上运行的 QT 5 1 应用程序播放简单的音频 wav 或 mp3 文件 我的控制台应用程序已成功构建并部署到 pi 但是 当我尝试播放该文件时收到一条消息 defaultServiceProvider
  • 在 Typescript 中,我可以创建强制需要属性的映射类型吗?

    在 Typescript 中 我们有映射类型 可以将属性从一种类型映射到另一种类型 一个常见的示例是 Partial 类型 它使泛型类型上的所有属性都成为 可选 我想实现相反的效果 比如 必需 其中所有属性都被设置为 必需 而不管它们预先的