如何将函数类型应用于函数声明

问题描述 投票:0回答:3

给定以下类型:

type Add = (x:number, y:number) => number

我可以声明该类型的

const
并定义函数的其余部分,而无需显式指定类型。 Typescript 知道
x
是一个数字,
y
是一个数字。

const add: Add = (x, y) => x + y;

我更喜欢使用

function
而不是
const
来定义函数,但是似乎没有办法输入完整的函数声明。看来您被迫单独定义参数和返回类型。有没有办法在下面的声明中使用
Add
类型,这样我就不必指定
x
是一个数字,
y
是一个数字

function add(x, y) {
    return x + y;
}

无需被迫做类似的事情

function add(x: Parameters<Add>[0], y: Parameters<Add>[1]): ReturnType<Add> {
    return x + y;
}
typescript
3个回答
19
投票

您不能为函数声明指定类型。您只能使用

Parameters
ReturnType
。唯一的小改进是对参数使用解构:

type Add = (x:number, y:number) => number
function add(...[x, y]: Parameters<Add>): ReturnType<Add> {
    return x + y;
}

游乐场链接


0
投票

您可以指定函数表达式的类型,但不能指定函数声明的类型。

// index.d.ts
export function add(a: string, b: string): string;
export function add(a: number, b: number): number;
// index.js
/**
 * @typedef {import('./index.d.ts').add} AddFunction
 */

/**
 * @type AddFunction
 * @param {any} a
 * @param {any} b
 */
export const add = function(a, b) {
    return a + b;
}

add(1, 2);
add('a', 'b');
add(1, '2')  
❯ ./node_modules/.bin/tsc
index.js:16:1 - error TS2769: No overload matches this call.
  Overload 1 of 2, '(a: string, b: string): string', gave the following error.
    Argument of type 'number' is not assignable to parameter of type 'string'.
  Overload 2 of 2, '(a: number, b: number): number', gave the following error.
    Argument of type 'string' is not assignable to parameter of type 'number'.

16 add(1, '2');
   ~~~~~~~~~~~

Found 1 error in index.js:16

游乐场链接


0
投票

对于函数表达式:

export type Add = (x: number, y: number) => number

export const add: Add = function add (x, y) {
  return x + y;
}

对于函数声明:

export function add (x: number, y: number): number

export function add (x: any, y: any) {
  return x + y;
}
© www.soinside.com 2019 - 2024. All rights reserved.