【问题标题】:Generic type is type script泛型类型是类型脚本
【发布时间】:2022-01-12 05:24:31
【问题描述】:
function identity<String>(arg: String): String {
  return arg;
}
 
let myIdentity = identity([2]);
console.log()

嗨,有人能帮我理解为什么即使我传递一个数字数组也不会引发任何类型错误吗?

  1. 是不是因为类型是 "String" 而不是 "string" ,它查找对象而不是原始对象?
  2. 如果答案是“是”,如果我将所有内容都更改为字符串,我会收到错误消息说从未使用过字符串
function identity<string>(arg: string): string {
  return arg;
}
 
let myIdentity = identity([2]);
console.log(myIdentity )

'string' is declared but its value is never read.

【问题讨论】:

    标签: javascript typescript typescript-typings


    【解决方案1】:

    您是shadowing 内置类型Stringstring,使用它们的名称作为您的通用参数。就用一个非内置的参数名来解决吧:

    TS Playground link

    function identity<T extends string>(value: T): T {
      return value;
    }
     
    identity([2]); // error [2] doesn't extend string
    identity('2'); // ok
    

    如果你想要一个没有任何约束的泛型恒等函数,你可以使用不受约束的类型参数:

    TS Playground link

    function identity<T>(value: T): T {
      return value;
    }
     
    const numberArrayValue = identity([2]); // number[]
    const objectValue = identity({b: 2}); // { b: number; }
    const stringLiteralValue = identity('2'); // "2"
    const numberLiteralValue = identity(2); // 2
    

    【讨论】:

    • 谢谢,那么这句话是什么意思呢? function identity(value: number): number { return value; }
    • 即使我将泛型类型定义为 T 扩展字符串,它也不会引发任何错误,而是设置 param 并返回 number 。这种降级在逻辑上意味着什么
    • @PDHide "如果我将泛型类型定义为 T 扩展字符串,但设置参数并返回数字":类型参数的工作方式与普通函数参数类似:如果你不这样做不要使用它们,它们不相关。 T extends string 意味着提供给T 类型变量的任何值都必须可分配给string 类型。我建议阅读 TypeScript 手册的 generics 部分以了解泛型参数和 extends 关键字。
    猜你喜欢
    • 2019-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多