typescript - 如何从类型中提取不可为空的属性名称?
问题描述
我想定义一个映射的条件类型,以便我可以从可以具有null
值的类型中提取属性名称,例如
interface Person {
name: string
age: number
category: string | null
}
type NotNullablePersonProps = NotNullablePropertyNames<Person>
// NotNullablePersonProps should be "name" | "age"
我看过下面的例子:
type OptionalPropertyNames<T> = {
[K in keyof T]-?: undefined extends T[K] ? K : never
}[keyof T];
type RequiredPropertyNames<T> = {
[K in keyof T]-?: undefined extends T[K] ? never : K
}[keyof T];
不过,我无法使其适应具有null
属性的情况。
如何定义NotNullablePropertyNames
映射条件类型以返回所有不能为的属性名称null
?
解决方案
undefined
在您提供的代码中替换null
为按预期工作,前提是您strictNullChecks
启用了。没有那个选项string | null
,就string
没有什么可提取的
interface Person {
name: string
age: number
category: string | null
}
type NotNullablePersonProps = NotNullablePropertyNames<Person> // name | age
type NotNullablePropertyNames<T> = {
[K in keyof T]-?: null extends T[K] ? never : K
}[keyof T];
推荐阅读
- javascript - 反应:在具有多个跨度元素的 div 中选择事件
- dynamics-crm - Opportunity 上更改的销售阶段未反映在图表和视图中 - CRM Online 9.0
- cytoscape.js - 如何将 Cytoscape.js 与打字稿一起使用
- c# - 为什么我在dotnet core中使用GZipStream解压时只得到前几行文件
- c# - 为什么我的 ReceivedBufferSize 很大?最多 65535 字节
- python - Raspistill:有些图片是黑色的
- r - 如何去除多余的 | (管道)加载时行分隔符 | (管道)分隔的文本到 R
- python - 烧瓶领事和领事DNS
- php - 如何在类别名称中搜索字符串?
- ruby-on-rails - Ruby 整数总是四舍五入到最接近的整数并且不会保存小数位