【问题标题】:Typescript keyof array includes prototype methodsTypescript keyof 数组包含原型方法
【发布时间】:2021-09-23 15:09:34
【问题描述】:

我有以下代码:

const arr = [1, 2, 3] as const;

type Keys = keyof typeof arr;

type T = {
  [K in Keys]: K extends 1 ? 2 : 3 // dummy
}

为什么T 类型包含prototype keys

在这种情况下,我希望密钥只有 012。如何只获取数组键?

我们如何通过遍历数组的键来创建一个新类型?

【问题讨论】:

标签: typescript


【解决方案1】:
  1. 为什么K extends 1 的评估结果不正确?

因为TS应该和纯javascript属性访问算法一致。见MDN docs

属性名称是字符串或符号。任何其他值(包括数字)都被强制转换为字符串。这会输出 'value',因为 1 被强制转换为 '1'。

尽管数组/元组是按数字索引的,但它们的所有索引都在 JS 引擎的底层进行了字符串化。这就是为什么const result = arr['1'] // 2 从 TS 的角度来看是完全有效的。

所有数字键都是事实上的字符串。

看这个例子:

declare var record: Record<number, string>

const result = record['2'] // string
const result2 = record[2] // string
const result3 = record['hello'] // expected error
  1. 我怎样才能只获得数组键? - 这是 this 答案的副本

  2. 你能解释一下你为什么这样做吗:

T extends ${number} instead of T extends number?

例子:

type FilterNumbers<T extends PropertyKey> = T extends `${number}` ? T : never

T extends ${number}`` - 字面意思是如果T 扩展了一个字符串化的数字。

这里还有一个例子:

type StringNumber<T extends `${number}`> = T

type Test = StringNumber<'42'> // ok

type Test1 = StringNumber<'-0.3'> // ok
type Test2 = StringNumber<`${typeof NaN}`> // ok, but in fact is a drawback
type Test3 = StringNumber<`01`> // ok, but also drawback

type Test4 = StringNumber<'hello'> // error

PLayground

【讨论】:

  • 谢谢。你能解释一下为什么你在做 T extends ${number} 而不是 T extends number`?
  • @undefined 进行了更新
  • @undefined 如果您想为数字制作一些验证器,我的意思是禁止负数和分数,请参阅此答案stackoverflow.com/questions/69281203/…
猜你喜欢
  • 2018-12-12
  • 1970-01-01
  • 2018-11-09
  • 1970-01-01
  • 2021-02-22
  • 1970-01-01
  • 2011-12-04
相关资源
最近更新 更多