【发布时间】:2015-11-25 07:38:15
【问题描述】:
打字稿手册目前没有关于箭头功能的内容。正常功能 可以使用以下语法进行一般输入: 示例:
function identity<T>(arg: T): T {
return arg;
}
箭头函数的语法是什么?
【问题讨论】:
标签: typescript
打字稿手册目前没有关于箭头功能的内容。正常功能 可以使用以下语法进行一般输入: 示例:
function identity<T>(arg: T): T {
return arg;
}
箭头函数的语法是什么?
【问题讨论】:
标签: typescript
语言规范在 p.64f 上说
( ... ) => { ... } 形式的构造可以被解析为 带有类型参数或类型断言的箭头函数表达式 应用于没有类型参数的箭头函数。它被解决为 前者[..]
示例:
// helper function needed because Backbone-couchdb's sync does not return a jqxhr
let fetched = <
R extends Backbone.Collection<any> >(c:R) => {
return new Promise(function (fulfill, reject) {
c.fetch({reset: true, success: fulfill, error: reject})
});
};
【讨论】:
我发现上面的例子令人困惑。 我正在使用 React 和 JSX,所以我认为这会使场景复杂化。
我从 TypeScript Deep Dive 那里得到了澄清,其中说明了箭头泛型:
解决方法:在泛型参数上使用 extends 来提示编译器它是泛型的,这来自一个对我有帮助的更简单的示例。
const identity = < T extends {} >(arg: T): T => { return arg; }
【讨论】:
解释语法 referenced by Robin... 的完整示例将它带回家:
以下内容可以正常工作:
function foo<T>(x: T): T { return x; }
但是使用箭头泛型函数不会:
const foo = <T>(x: T) => x; // ERROR : unclosed `T` tag
解决方法:在泛型参数上使用 extends 来提示编译器 它是通用的,例如:
const foo = <T extends unknown>(x: T) => x;
【讨论】:
const foo 声明一些预定义的泛型类型?即type GenericFun<T, A=T> = (payload: A) => T; 然后在不提供T 类型的情况下使const foo: GenericFun 仍然是通用的?
.tsx 文件(TypeScript + JSX)中的错误。在.ts 文件中它可以正常工作,正如您在TypeScript playground 上看到的那样。
const foo = <T,>(x: T) => x; 以避开 JSX 的歧义。
这对我有用
const Generic = <T> (value: T) => {
return value;
}
【讨论】:
.ts 文件中,这可行。否则必须延长。
如果您在 .tsx 文件中,则不能只写 <T>,但这有效:
const foo = <T, >(x: T) => x;
与extends {} hack 不同,这种hack 至少保留了意图。
【讨论】:
const foo = <T = any,>(x: T) => x 不起作用...
虽然extends {} 的流行答案有效并且比extends any 更好,但它强制T 成为一个对象
const foo = <T extends {}>(x: T) => x;
为避免这种情况并保持类型安全,您可以改用extends unknown
const foo = <T extends unknown>(x: T) => x;
【讨论】:
我使用这种类型的声明:
const identity: { <T>(arg: T): T } = (arg) => arg;
如果您需要,它允许为您的函数定义额外的道具,并且在某些情况下,它有助于使函数体从通用定义中保持清洁。
如果你不需要额外的道具(命名空间之类的东西),它可以简化为:
const identity: <T>(arg: T) => T = (arg) => arg;
【讨论】:
<T> 时,这对我不起作用。 Typescript 告诉我<T> 没有用于函数定义位置的<T>,并告诉我它在函数体中我引用它的位置找不到<T>。使用 <T,> 'hack' 我没有这个问题。
这么晚了,但是 ES6 不需要扩展它仍然对我有用.... :)
let getArray = <T>(items: T[]): T[] => {
return new Array<T>().concat(items)
}
let myNumArr = getArray<number>([100, 200, 300]);
let myStrArr = getArray<string>(["Hello", "World"]);
myNumArr.push(1)
console.log(myNumArr)
【讨论】:
<T, >。如@jbmilgrom 回答下的@Thomas 评论中所述
2021 年,Ts 4.3.3
const useRequest = <DataType, ErrorType>(url: string): Response<DataType, ErrorType>
=> {
...
}
【讨论】:
这对我有用
const logSomething = <T>(something:T): T => {
return something;
}
【讨论】:
我知道我迟到了这个答案。但是考虑回答这个问题,以防其他人觉得它有帮助。没有一个答案提到如何将泛型与async 箭头函数一起使用。
来了:
const example = async <T> (value: T) => {
//awaiting for some Promise to resolve or reject;
const result = await randomApi.getData(value);
}
【讨论】:
为多个依赖的泛型类型添加示例:
这个函数,转化为箭头函数如下:
http.get = function <T = any, R = AxiosResponse<T>>(url: string, config?: AxiosRequestConfig): Promise<R> {
config.withCredentials = true;
....
};
注意扩展而不是等号:
http.get = async <T extends any, R extends unknown = AxiosResponse<T>>(url: string, config?: AxiosRequestConfig): Promise<R> => {
config.withCredentials = true;
...
};
【讨论】: