作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下类型:
interface A {
p1: string
p2?: string
}
我想生成一个子类型B
,并将可选属性转换为可为空的属性。相当于:
interface B {
p1: string
p2: string | null
}
我尝试过这样的事情:
type VuexPick<T, K extends keyof T> = {
[P in K]-?: T[P] extends undefined ? null : T[P];
};
type B = VuexPick<A, "p1" | "p2">;
但是这不起作用。有什么想法吗?
最佳答案
您的类型 B
解决了这个问题:
type B = {
p1: string extends undefined ? null : string
p2: string | undefined extends undefined ? null : string | undefined
};
string | undefined
因为父类(super class)型不扩展 undefined
,情况正好相反。所以你最终会得到这种类型:
type B = {
p1: string;
p2: string;
}
您可以创建一个 UndefinedToNull
类型,这会导致 distributive conditional type应用,如T
是 naked type parameter现在。
type VuexPick2<T, K extends keyof T> = {
[P in K]-?: UndefinedToNull<T[P]>;
};
type UndefinedToNull<T> = T extends undefined ? null : T
type B2 = VuexPick2<A, "p1" | "p2">; // type B2 = { p1: string; p2: string | null;}
例如类型UndefinedToNull<string | undefined>
与 B4
相同:
type B4 =
| (string extends undefined ? null: string)
| (undefined extends undefined ? null: undefined) // type B4 = string | null
关于typescript - 将 TypeScript 接口(interface)的可选属性转换为可为 null 的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58318161/
我正在尝试用 Swift 编写这段 JavaScript 代码:k_combinations 到目前为止,我在 Swift 中有这个: import Foundation import Cocoa e
我是一名优秀的程序员,十分优秀!