gpt4 book ai didi

typescript - 必需但可能未定义的类型

转载 作者:搜寻专家 更新时间:2023-10-30 21:47:06 25 4
gpt4 key购买 nike

我想在 TypeScript 中创建一个类,它以一种需要具有该接口(interface)的所有属性(甚至是可选属性)的方式实现接口(interface),但允许可选属性为 undefined。 .

这是 Required_ish<T> type 会比 Required<T> 宽, 但比 T 更严格,因为它需要我明确列出所有属性。然而,相同的值可以分配给 Required_ish<T> 的参数。和 T .

我已经试过了,但它似乎与 Required 做同样的事情:

type Required_ish<T> = T & { [K in keyof T]-?: T[K] | undefined }

所需的属性:

interface Foo {
a: string;
b?: number;
}

class Bar1 implements Foo { a = ''; } // allowed
class Bar2 implements Required_ish<Foo> { a = ''; } // error
class Bar3 implements Required<Foo> { a = ''; } // error

class Bar4 implements Foo { a = ''; b = undefined; } // allowed
class Bar5 implements Required_ish<Foo> { a = ''; b = undefined; } // allowed
class Bar6 implements Required<Foo> { a = ''; b = undefined; } // error

class Bar7 implements Foo { a = ''; b = 0; } // allowed
class Bar8 implements Required_ish<Foo> { a = ''; b = 0; } // allowed
class Bar9 implements Required<Foo> { a = ''; b = 0; } // allowed

最佳答案

我终于找到了解决办法。而且它比我预期的更具可读性。

type Required_ish<T> =
{
[K in keyof Required<T>]: T[K]
};

好的,但是为什么这样行得通呢?让我们分解一下。

首先,我从同态 mapped type 开始:

type Required_ish<T> = { [K in keyof T]: T[K] }

映射类型是一种允许您修改类型但保持其内部结构(元组仍然是元组)和属性修饰符(只读、可选)的功能,除非您明确说明。我刚刚写的那行或多或少是一种身份类型:对于 T 的每个键它返回与 T 相同的类型和修饰符有。

现在有两个修饰符可以改变属性的必要性:

{ [K in keyof T]?:  T[K] } // add the optional modifier
{ [K in keyof T]-?: T[K] } // remove the optional modifier

使用 -? 可能很诱人在这里,但遗憾的是这个修饰符做了两件事。它不仅从属性中删除了 optional 修饰符,还从结果类型中删除了 undefined。这意味着无论何时您使用 -? ,您无法返回扩展未定义的类型。

幸运的是,我们可以从 T 中获取 key , 但来自 Required<T> .由于编译器从左侧(: 之前的部分)获取所有修饰符,因此该属性将具有与 Required<T>[K] 相同的修饰符。 .这意味着它永远不会是可选的,并且 readonly修改器将保持不变。因为我们还没有使用 -?修饰符,T[K]将保持完整并且可能未定义。

这样我们就有效地绕过了 -? 的副作用结果类型完全符合我的要求。

关于typescript - 必需但可能未定义的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52968745/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com