Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在typescript中获取`keyof`非可选属性名_Typescript - Fatal编程技术网

在typescript中获取`keyof`非可选属性名

在typescript中获取`keyof`非可选属性名,typescript,Typescript,这是我的界面 interface X { key: string value: number | undefined default?: number } 但我只想要非可选的钥匙,又名“键”|“值”,或仅是“键”(两者对我都可以) type KeyOfX=KeyOfX为我提供了“key”|“value”|“default” 键入NonOptionalKeyOfX=keyof NonOptionalX将的“key”|“value”|“default”设置为-?仅删除可选修

这是我的界面

interface X {
    key: string
    value: number | undefined
    default?: number
}
但我只想要非可选的钥匙,又名<代码>“键”|“值”,或仅是
“键”
(两者对我都可以)

type KeyOfX=KeyOfX
为我提供了
“key”|“value”|“default”

键入NonOptionalKeyOfX=keyof NonOptionalX
的“key”|“value”|“default”
设置为
-?
仅删除可选修饰符,并使所有修饰符成为非可选修饰符


另外,我使用Typescript 2.9

您可以使用形式为
未定义扩展名k?never:k
never
替换
未定义的
值的键,然后使用union
T | never
对于任何类型都是
T

interface X {
    key: string
    value: number | undefined
    default?: number
}


type NonOptionalKeys<T> = { [k in keyof T]-?: undefined extends T[k] ? never : k }[keyof T];

type Z = NonOptionalKeys<X>; // just 'key'
接口X{
关键字:字符串
值:数字|未定义
默认值?:数字
}
键入NonOptionalKeys={[k in keyof T]-?:未定义的扩展T[k]?从不:k}[keyof T];
类型Z=非可选键;//只是“钥匙”
此外,该评论可能与以下内容相关:

但我只想要非可选的钥匙,又名。“key”|“value”或仅仅是“key”(两者都适合我)

虽然介绍了
“key”
的更简单选项,但我想介绍一个不太明显的选项
“key”|“value”
。可能需要它,因为
value
不是可选字段。它可以被指定为
未定义的
,但它应该在x检查中传递一个
“值”

type NonOptionalKeys<T> = { [K in keyof T]-?: T extends { [K1 in K]: any } ? K : never}[keyof T]
type NonOptionalKeys={[K in keyof T]-?:T扩展了{[K1 in K]:any}?K:never}[keyof T]
工作原理:

  • 映射对象类型(
    K
    )中的键实际上不仅是类型,而且是附加了“requiredness”和“ReadOnlines”的类型
  • 使用
    -?
    T
    的键进行迭代,在将其放入
    K
    之前,需要使用可选键
  • {[K中的K1]:任何}
    对象都是具有单个必需键的对象
  • 如果原始类型扩展了它,则该键是必需的,我们将其名称保留为该键的值类型
  • 可选密钥未通过检查,将被收集为
    永不
  • 结果对象包含原始类型的键的名称作为字段,相同的键或
    从不
    作为值
    
  • 使用
    [keyof T]
    计算所有值类型的并集,删除
    从不
    类型(
    (a |从不)=a
    ),只剩下所有所需键的并集

这种过滤器的唯一缺点是,当使用
keyof T
获取所有对象键时,编译器错误显示键字符串。但是错误仍然很清楚:
类型“foo”不可分配给类型“NonOptionalKeys”
type NonOptionalKeys<T> = { [K in keyof T]-?: T extends { [K1 in K]: any } ? K : never}[keyof T]