- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
这个问题在这里已经有了答案:
Why do I have to specify parameter names in a TS function type?
(3 个回答)
去年关闭。
尝试使用 TypeScript 弄湿我的脚,但我不断遇到 trouble .安 old function resurfaced today作为练习,我很好奇是否可以将其转换为 TypeScript。到目前为止,颈部完全疼痛。
declare type Ord = number | string;
// type signature for f sucks really bad
// (f: Ord => Ord => boolean) would be really nice, if possible
// but instead I have to give names (_) for the parameters? dumb
const arrayCompare = (f: (_: Ord) => (_: Ord) => boolean) => ([x,...xs]: Ord[]) => ([y,...ys]: Ord[]): boolean => {
if (x === undefined && y === undefined)
return true;
else if (! f (x) (y))
return false;
else
return arrayCompare (f) (xs) (ys);
}
// here the names of the parameters are actually used
const eq = (x: Ord) => (y: Ord) : boolean => x === y;
// well at least it works, I guess ...
console.log(arrayCompare (eq) ([1,2,3]) ([1,2,3])); // true
console.log(arrayCompare (eq) (['a','b','c']) (['a','b','c'])); // true
所以这个问题特别是关于(见
粗体 )
const arrayCompare = (f: (_: Ord) => (_: Ord) => boolean) => ...
f
期望类型的高阶函数
Ord => Ord => boolean
但是如果我使用这种类型签名
// danger !! unnamed parameters
(f: (Ord) => (Ord) => boolean)
TypeScript 将假设
Ord
因为参数的名称和隐含的类型是
any
// what TypeScript thinks it means
(f: (Ord: any) => (Ord: any) => boolean)
当然这不是我想要的,但这就是我得到的。为了得到我真正想要的,我必须指定高阶函数的参数名称
// now it's correct
(f: (_: Ord) => (_: Ord) => boolean)
但拜托,这毫无意义。我只能访问
f
在这种情况下,不去参数
f
当我最终调用它时会绑定(bind)......
"as far as names for parameters, consider a function that takes a callback of -> (number -> number -> number) ->, so based solely on the types your options are: add, subtract, multiply, divide, power, compare of which only one makes sense, now if a callback parameter had a name add: (number -> number -> number) the choice would be obvious" – Aleksey Bykov
(number -> number -> number)
命名堆更多的函数签名。
first
, second
, mod
, min
, max
&
, |
, xor
, <<
, 和 >>
(x, y) => sqrt(sq(x) + sq(y))
(x, y) => x + x + y + y + superglobalwhocares
// this
func = (f: (number => number => number)) => ...
// not this
func = (f: (foo: number) => (bar: number) => number)) => ...
为什么?因为
f
不知道我将提供的函数的参数。
// for the record, i would never name parameters like this
// but for those that like to be descriptive, there's nothing wrong with these
const add = (addend: number) => (augend: number) => number ...
const sub = (minuend: number) => (subtrahend: number) => number ...
const divide = (dividend: number) => (divisor: number) => number ...
const mult = (multiplicand: number) => (multiplier: number) => number ...
// I could use any of these with my func
func (add ...)
func (sub ...)
func (divide ...)
func (mult ...)
我无法提供
f
的名称
func
中的参数如果我试过了!因为谁知道我将使用哪个功能?所有这些都是合适的。
// maybe the user thinks only a division function can be specified (?)
func = (f: (dividend: number) => (divisor: number) => number) => ...
dividend
和
divisor
不适合这里,因为上面列出的任何功能都适合。在
最好的我可以这样做
// provide generic name for f's parameters
func = (f: (x: number) => (y: number) => number) => ...
但那又有什么意义呢?不像
x
和
y
成为绑定(bind)标识符。和
x
和
y
不提供额外的描述——我想这让我明白了我的观点:它们并不意味着有名称或描述。
f
对我们可能使用它的方式零知识,但这并不重要;只要它有
(number => number => number)
界面,这就是我们所关心的。这是我们可以提供给
func
用户的最有用的信息。关于
f
范围。
"It would be quite confusing for function like:
foo(cb: (number, number) => (number, string) => boolean)
What does it do?" - unional
(cb: (number, number) => (number, string) => boolean))
是一个设计糟糕的函数(你能说出多少有用的混合类型四元(4元)函数?),这无关紧要。
f
无法假装知道我可以想出的无数函数的任何描述符,这些函数使用这样的签名。
_
有意义的名字?
const apply2 = (f: (_: number) => (_: number) => number) => (x: number) => (y: number): number => {
return f (x) (y)
};
const sqrt = (x: number): number => Math.sqrt(x);
const sq = (x: number): number => x * x;
const add = (addend: number) => (augend: number): number => addend + augend;
const pythag = (side1: number) => (side2: number): number => sqrt(add(sq(side1)) (sq(side2)));
console.log(apply2 (add) (3) (4)); // 7
console.log(apply2 (pythag) (3) (4)); // => 5
如果没有,您能否提出一个令人信服的论点,为什么这些名称必须出现在您的 TypeScript 签名中?
最佳答案
编写柯里化定义很困难,至少以一种可读的方式编写。
我会做的是尽可能多地提取函数声明之外的签名,如下所示:
type Ord = string | number;
type ThirdFunction = (objs: Ord[]) => boolean;
type SecondFunction = (objs: Ord[]) => ThirdFunction;
type FirstFunction = (fn: (o: Ord) => (o: Ord) => boolean) => SecondFunction;
const arrayCompare: FirstFunction = f => ([x,...xs]) => ([y,...ys]) => {
...
}
declare
你之前的
Ord
类型别名,没有必要。您可以为这些类型找到更好的名称。
boolean
这里:
const eq = (x: Ord) => (y: Ord) : boolean => x === y;
const eq = (x: Ord) => (y: Ord) => x === y;
type
来表达该函数宣言。考虑到所有因素,可读性相当不错。
type Ord = number | string;
type arrayCompareFunc = (f: (x: Ord) => (y: Ord) => boolean)
=> (xs: Ord[])
=> (ys: Ord[])
=> boolean;
const arrayCompare: arrayCompareFunc = f => ([x,...xs) => ([y,...ys) => {
...
};
关于typescript - 我是否必须在 TypeScript 中为高阶函数类型指定参数名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42322251/
我已经写了并且 npm 发布了这个:https://github.com/justin-calleja/pkg-dependents 现在我正在用 Typescript 编写这个包:https://g
我有一个函数,我想在 TypeScript 中模拟它以进行测试。在我的测试中,我只关心 json和 status .但是,当使用 Jest 的 jest.spyOn 时我的模拟函数的类型设置为返回 h
我正在使用一个库 (Axios),它的包中包含 Typescript 声明。 我想声明一个将 AxiosResponse(在库的 .d.ts 文件中声明)作为参数的函数。我有以下内容: functio
我是 Typescript 的新手。我想使用 将一个 Typescript 文件加载到另一个 Typescript 文件中标签。 我做了一些事情,但它不起作用!请帮助我。 first.ts: imp
为什么我会收到下面屏幕截图中显示的错误? Atom 说我的 tsconfig.json“项目文件包含无效选项”用于 allowJs、buildOnSave 和 compileOnSave。 但是应该允
所以我正在创建一个 TypeScript 库,我可以轻松地将所有生成的 JS 文件编译成一个文件。有没有办法将所有 .ts 和 .d.ts 编译成一个 .ts 文件? 除了支持 JS 的版本(较少的智
Microsoft Research 提供了一种名为Safer TypeScript 的新 TypeScript 编译器变体: http://research.microsoft.com/en-us/
我需要这个来在单个文件中分发 TypeScript 中的库。有没有办法将多个 typescript 文件合并到(一个js文件+一个 typescript 定义)文件中? 最佳答案 要创建一个库,您可以
用例:我想知道一个函数在 typescript 中执行需要多少时间。我想为此目的使用装饰器。我希望装饰器应该返回时间以便(我可以进一步使用它),而不仅仅是打印它。 例如: export functio
我想检查一个类型是否可以为 null,以及它是否具有值的条件类型。 我尝试实现 type IsNullable = T extends null ? true : false; 但是好像不行 type
我的问题是基于这个 question and answer 假设我们有下一个代码: const myFn = (p: { a: (n: number) => T, b: (o: T) => v
我知道双重否定前缀,我知道 TypeScript 的单后缀(非空断言)。 但是这个双后缀感叹号是什么? /.*验证码为(\d{6}).*/.exec(email.body!!)!![1] 取自here
我正在使用以下文件结构在 Webstorm 中开发一个项目 | src | ... | many files | types | SomeInterface |
在 TypeScript 类中,可以为属性声明类型,例如: class className { property: string; }; 如何在对象字面量中声明属性的类型? 我试过下面的代码,但它
我正在寻找一种在不丢失推断类型信息的情况下将 TypeScript 中的文字值限制为特定类型的好方法。 让我们考虑一个类型Named,它保证有一个名字。 type Named = { name:
在 TypeScript 中,我想创建一个联合类型来表示属于一个或多个不同类型的值,类似于 oneOf在 OpenAPI或 JSON Schema .根据a previous answer on a
type Func = (foo:string) => void // function expression const myFunctionExpression:Func = function(f
假设我有一个联合类型,我正在使用类似 reducer 的 API 调用模式,看起来像这样: type Action = { request: { action: "create
我在 typescript 中有以下去抖功能: export function debounce( callback: (...args: any[]) => void, wait: numb
在 Vue3 的 defineComponent 函数中,第一个泛型参数是 Props,所以我在这里使用 Typescript 接口(interface)提供我的 props 类型。喜欢: expor
我是一名优秀的程序员,十分优秀!