想象一下,我有一个函数可以访问常量(永不突变)(例如,查询表或数组)。在函数范围之外的任何地方都不会引用该常数。我的直觉告诉我,应该在函数范围之外定义此常量(下面的选项A),以避免在每次函数调用时都(重新)创建该常量,但这确实是现代Javascript引擎的工作方式吗?我想认为现代引擎可以看到该常量从未修改过,因此只需创建和缓存一次(是否有此术语?)。浏览器是否以相同的方式缓存闭包中定义的功能?
在访问函数的位置旁边(选项B),简单地在函数内部定义常量是否有不可忽略的性能损失?对于更复杂的对象情况是否有所不同?
// Option A:
function inlinedAccess(key) {
const inlinedLookupTable = {
a: 1,
b: 2,
c: 3,
d: 4,
}
return 'result: ' + inlinedLookupTable[key]
}
// Option B:
const CONSTANT_TABLE = {
a: 1,
b: 2,
c: 3,
d: 4,
}
function constantAccess(key) {
return 'result: ' + CONSTANT_TABLE[key]
}
Run Code Online (Sandbox Code Playgroud)
我创建了一个jsperf测试,比较了不同的方法:
Object
-内联(选项A)Object
-常数(选项B)@jmrk建议的其他变体:
Map
-内联Map
- 不变switch
-内联值初步发现(在我的机器上,请自行尝试):
我有一个名为 React 的组件Field
,用于呈现各种类型的表单输入,包括通过其他 React 组件实现的自定义输入。输入的类型由 确定type
,它可以是一个已知字符串(keyof FIELD_TYPES
,它反过来决定要创建的 React 组件)或任何类型的 React 组件(基于函数或类)。这已经实现了,但是我在尝试为实现提供正确的类型时遇到了一些问题。请注意,目标之一是确保正确推断道具,以便智能感知可以建议结果元素的有效属性。
这个代码沙盒展示了我正在尝试修复的 3 个不同的 Typescript 警告。每个问题都附有// FIXME
注释;
(1) & (2):类型 X 不能用于索引类型 'Y' - 到目前为止,我一直无法在这里找到满足 Typescript 的方法。
(3): Typescript 不接受自定义组件 - 不确定如何修改类型以允许这样做。
我也尝试过使用区分联合,但在尝试推断组件的 props 时遇到了困难,因为它是type
通过FIELD_TYPES
映射传递或解决的。使用这种方法的答案也很有效。
const FIELD_TYPES = {
text: "input",
checkbox: "input",
textarea: "textarea",
custom: Custom
} as const;
type FieldTypeMap = typeof FIELD_TYPES
type KeysOfType<T, K> = { [I in keyof T]: T[I] extends …
Run Code Online (Sandbox Code Playgroud)