打字稿手册目前没有任何箭头功能。普通函数可以使用以下语法进行通用键入:示例:
function identity<T>(arg: T): T {
return arg;
}
箭头功能的语法是什么?
打字稿手册目前没有任何箭头功能。普通函数可以使用以下语法进行通用键入:示例:
function identity<T>(arg: T): T {
return arg;
}
箭头功能的语法是什么?
Answers:
完整的示例解释了Robin所引用的语法...为我带回家了:
如下所示的效果很好:
function foo<T>(x: T): T { return x; }
但是,使用箭头通用函数不会:
const foo = <T>(x: T) => x; // ERROR : unclosed `T` tag
解决方法:对通用参数使用扩展,以提示编译器是通用的,例如:
const foo = <T extends unknown>(x: T) => x;
GenericFun<T, A=T>
定义一个包括其他类型 GenericFun<number>
和的集合GenericFun<string>
。允许通用类型直接构成类型注释(例如const)const foo: GenericFun
,但是会趋于侵蚀静态安全性,否则会通过要求特殊性来提供安全性,例如,const foo: GenericFun<string>
或const foo: GenericFun<number>
const foo = <T,>(x: T) => x;
来避免JSX的歧义。
我发现上面的例子令人困惑。我正在使用React和JSX,所以我认为这使情况变得复杂。
我从TypeScript Deep Dive中得到了澄清,其中指出了箭头泛型:
解决办法:对通用参数使用扩展,以提示编译器是通用的,这来自于一个简单的示例,该示例对我有所帮助。
const identity = < T extends {} >(arg: T): T => { return arg; }
如果您在.tsx
文件中,则不能只写<T>
,但这可以工作:
const foo = <T, >(x: T) => x;
与extends {}
hack 相对,此hack至少保留了意图。
const foo = <T = any,>(x: T) => x
不起作用……
语言规范在p.64f中说
形式为<T>(...)=> {...}的构造可以解析为具有类型参数的箭头函数表达式,或应用于没有类型参数的箭头函数的类型断言。它被解析为前者[..]
例:
// 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})
});
};
尽管流行的答案是extends {}
可行的并且比更好extends any
,但它迫使T
成为对象。
const foo = <T extends {}>(x: T) => x;
为了避免这种情况并保留类型安全性,您可以extends unknown
改用
const foo = <T extends unknown>(x: T) => x;
这么晚了,但是有了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, >
。如@Thomas评论(@jbmilgrom)答案中所述
const foo
?即type GenericFun<T, A=T> = (payload: A) => T;
然后使const foo: GenericFun
仍然通用而不提供T
类型?