typescript - 如何在胖箭头上创建打字稿尖括号并将其与冒号进行比较?
问题描述
这是我使用冒号的打字稿示例:
interface props {
legs: 2
};
interface body {
head: string,
torso: string,
legs: number
};
const fnGetBodyUsingColon = (props: props): body => ({
head: 'large',
torso: 'larger',
legs: props.legs
});
如何显示上述示例但使用泛型尖括号?
这种尝试给了我错误:
const fnGetBodyUsingAngleBrackets<T> = (props: T): T => ({
head: 'large',
torso: 'larger',
legs: props.legs
});
fnGetBodyUsingAngleBrackets 缺少返回类型注释,隐式具有任何返回类型
解决方案
回答语法问题:
泛型类型参数是调用签名的一部分,而不是您分配给它的变量的一部分。语法如下所示,在:<T>
之后移动=
const identity = <T>(t: T): T => t;
更新:如果上面没有编译,那是因为你正在使用 .tsx 文件或 JSX 支持,这会使解析器感到困惑。有关更多信息,请参阅此 Q/A。要解决此问题,您可以在类型参数声明后使用尾随逗号,例如
const identity = <T,>(t: T): T => t;
请注意,您的示例代码有问题。如果您修复语法,编译器会正确地给出错误:
const fnGetBodyUsingAngleBrackets = <T>(props: T): T => ({
head: 'large',
torso: 'larger',
legs: props.legs
}); // error!
// Type '{ head: string; torso: string; legs: any; }' is not assignable to type 'T'.
那是因为您声称它fnGetBodyUsingAngleBrackets()
接受任何类型的参数T
并返回与参数相同类型的值。您返回的值几乎可以肯定与参数的类型不同:
const oops = fnGetBodyUsingAngleBrackets({ foo: "bar", baz: "qux" });
// const oops: { foo: string; baz: string; }
console.log(oops.foo.toUpperCase()); // no compiler warning; error at runtime
我不确定您为什么要在此示例中使用泛型,所以我不确定如何建议您应该如何在此进行。
好的,希望有帮助;祝你好运!
推荐阅读
- python-3.x - 在 Linux 上更改用户时保持 Python3 脚本运行
- python - 使用 Pandas 的数据透视表,在末尾添加额外的行并进行减法计算
- javascript - 如何在浏览器上使用 Octokit 的`request.js`?
- java - 包含 Xpath 中的函数
- r - 在多个页面/链接上使用 R 进行网页抓取
- r - Quantstrat 将所有股权投资于头寸
- java - Thymeleaf 无法解析多模块 SpringBoot 项目中的模板
- serialization - 使用 flatbuffer 不会减少序列化数据的大小
- haskell - 类型类默认方法实例化中的模糊类型解析
- machine-learning - sklearn oneclass svm KeyError