- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
考虑 Parameters
实用程序类型,其底层类型为元组:https://www.typescriptlang.org/docs/handbook/utility-types.html#parameterstype
我有一个函数SomeFunction
.要将函数的参数用作类型,我写 Parameters<SomeFunction>
.
现在假设我想将函数的参数用作除第一个参数之外的类型。
显然,对于一个数组,我会使用类似 ...args.slice(1)
.但我不知道 Typescript 定义的切片实用程序。 Omit
仅适用于对象。
An answer to this SO question提供RemoveFirstFromTuple
效用。但这有点令人费解。是否有在类型定义中提取部分元组的内置方法?
最佳答案
是的,您可以使用 conditional type inference关于函数类型,与 the Parameters
utility type 的方式非常相似is implemented :
type ParametersExceptFirst<F> =
F extends (arg0: any, ...rest: infer R) => any ? R : never;
相比于
// from lib.es5.d.ts
type Parameters<T extends (...args: any) => any> =
T extends (...args: infer P) => any ? P : never;
并验证它是否有效:
declare function foo(x: string, y: number, z: boolean): Date;
type FooParamsExceptFirst = ParametersExceptFirst<typeof foo>;
// type FooParamsExceptFirst = [y: number, z: boolean]
declare function foo(x: string, y: number, z: boolean): Date;
Playground link to code
TupleSplit<T, N>
它需要一个元组
T
和一个数字
literal类型
N
, 并拆分元组
T
在索引
N
,返回两 block :第一 block 是第一个
N
T
的元素,第二件就是在那之后的一切。 (如果
N
大于
T
的长度,则第一段是
T
的全部,第二段为空):
type TupleSplit<T, N extends number, O extends readonly any[] = readonly []> =
O['length'] extends N ? [O, T] : T extends readonly [infer F, ...infer R] ?
TupleSplit<readonly [...R], N, readonly [...O, F]> : [O, T]
这通过
recursive conditional types 工作在
variadic tuples因此比相对简单的
ParametersExceptFirst
计算量更大上面的实现。如果您在长元组(长度超过 25 个左右)上尝试此操作,您可能会看到递归错误。如果你在行为不端的类型上尝试这个,比如非固定长度的元组或事物的联合,你可能会得到奇怪的结果。很脆弱;小心它。
type Test = TupleSplit<readonly ["a", "b", "c", "d", "e"], 3>
// type Test = [readonly ["a", "b", "c"], readonly ["d", "e"]]
看起来不错。
TupleSplit<T, N>
实现
TakeFirst<T, N>
, 只返回第一个
N
T
的元素, 和
SkipFirst<T, N>
,跳过第一个
N
T
的元素:
type TakeFirst<T extends readonly any[], N extends number> =
TupleSplit<T, N>[0];
type SkipFirst<T extends readonly any[], N extends number> =
TupleSplit<T, N>[1];
最后
TupleSlice<T, S, E>
生成元组切片
T
从起始位置
S
到结束位置
E
(记住,切片包括起始索引,不包括结束索引)取第一个
E
T
的元素并跳过第一个
S
结果的要素:
type TupleSlice<T extends readonly any[], S extends number, E extends number> =
SkipFirst<TakeFirst<T, E>, S>
slice()
确实,让我们编写一个函数并对其进行测试:
function slice<T extends readonly any[], S extends number, E extends number>(
arr: readonly [...T], start: S, end: E
) {
return arr.slice(start, end) as readonly any[] as TupleSlice<T, S, E>;
}
const tuple = ["a", "b", "c", "d", "e"] as const
// const tuple: readonly ["a", "b", "c", "d", "e"]
const ret0 = slice(tuple, 2, 4);
// const ret0: readonly ["c", "d"]
console.log(ret0); // ["c", "d"]
const ret1 = slice(tuple, 0, 9);
// const ret1: readonly ["a", "b", "c", "d", "e"]
console.log(ret1); // ["a", "b", "c", "d", "e"];
const ret2 = slice(tuple, 5, 3);
// const ret2: readonly []
console.log(ret2); // [];
这看起来不错;从
slice()
返回的数组具有准确表示其值的类型。
slice()
对于
S
和
E
,然后
TupleSlice<T, S, E>
很可能与数组切片实际发生的情况不对应:负面的“从头开始”行为可能是可以实现的,但它会更丑陋;非整数,甚至只是
number
尚未经过测试,但我预计会在夜间出现递归警告和其他问题。被警告!
关于javascript - 获取 Typescript "slice"元组的 'Parameters',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67605122/
我需要您在以下方面提供帮助。近一个月来,我一直在阅读有关任务和异步的内容。 我想尝试在一个简单的 wep api 项目中实现我新获得的知识。我有以下方法,并且它们都按预期工作: public Htt
我的可执行 jar 中有一个模板文件 (.xls)。不需要在运行时我需要为这个文件创建 100 多个副本(稍后将唯一地附加)。用于获取 jar 文件中的资源 (template.xls)。我正在使用
我在查看网站的模型代码时对原型(prototype)有疑问。我知道这对 Javascript 中的继承很有用。 在这个例子中... define([], function () { "use
影响我性能的前三项操作是: 获取滚动条 获取偏移高度 Ext.getStyle 为了解释我的应用程序中发生了什么:我有一个网格,其中有一列在每个单元格中呈现网格。当我几乎对网格的内容做任何事情时,它运
我正在使用以下函数来获取 URL 参数。 function gup(name, url) { name = name.replace(/[\[]/, '\\\[').replace(/[\]]/,
我最近一直在使用 sysctl 来做很多事情,现在我使用 HW_MACHINE_ARCH 变量。我正在使用以下代码。请注意,当我尝试获取其他变量 HW_MACHINE 时,此代码可以完美运行。我还认为
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 关闭 9 年前。 要求提供代码的问题必须表现出对所解决问题的最低限度的理解。包括尝试过的解决方案、为什么
由于使用 main-bower-files 作为使用 Gulp 的编译任务的一部分,我无法使用 node_modules 中的 webpack 来require 模块code> dir 因为我会弄乱当
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 5 年前。 Improve this qu
我使用 Gridlayout 在一行中放置 4 个元素。首先,我有一个 JPanel,一切正常。对于行数变大并且我必须能够向下滚动的情况,我对其进行了一些更改。现在我的 JPanel 上添加了一个 J
由于以下原因,我想将 VolumeId 的值保存在变量中: #!/usr/bin/env python import boto3 import json import argparse import
我正在将 MSAL 版本 1.x 更新为 MSAL-browser 的 Angular 。所以我正在尝试从版本 1.x 迁移到 2.X.I 能够成功替换代码并且工作正常。但是我遇到了 acquireT
我知道有很多关于此的问题,例如 Getting daily averages with pandas和 How get monthly mean in pandas using groupby但我遇到
This is the query string that I am receiving in URL. Output url: /demo/analysis/test?startDate=Sat+
我正在尝试使用 javascript 中的以下代码访问 Geoserver 层 var gkvrtWmsSource =new ol.source.ImageWMS({ u
API 需要一个包含授权代码的 header 。这就是我到目前为止所拥有的: var fullUrl = 'https://api.ecobee.com/1/thermostat?json=\{"s
如何获取文件中的最后一个字符,如果是某个字符,则删除它而不将整个文件加载到内存中? 这就是我目前所拥有的。 using (var fileStream = new FileStream("file.t
我是这个社区的新手,想出了我的第一个问题。 我正在使用 JSP,我成功地创建了 JSP-Sites,它正在使用jsp:setParameter 和 jsp:getParameter 具有单个字符串。
在回答 StoreStore reordering happens when compiling C++ for x86 @Peter Cordes 写过 For Acquire/Release se
我有一个函数,我们将其命名为 X1,它返回变量 Y。该函数在操作 .on("focusout", X1) 中使用。如何获取变量Y?执行.on后X1的结果? 最佳答案 您可以更改 Y 的范围以使其位于函
我是一名优秀的程序员,十分优秀!