使用extends的TypeScript问题

mi7gmzs6  于 2023-05-19  发布在  TypeScript
关注(0)|答案(2)|浏览(138)

我收到TypeScript错误
在代码中使用以下内容时
错误:
类型“string”不能分配给类型“T extends string?”string:string[]'。类型“string[]”不能分配给类型“T extends string?”string:string[]'。
我想让函数的返回类型使用泛型推断,如何实现呢?

console.clear()
function sayHello<T extends string | string[]>(name: T): T extends string ? string : string[] {
    if (typeof name === 'string') {
        return `Hi, ${name}!`;
    } else if (Array.isArray(name)) {
        return name.map(name => `Hi, ${name}!`);
    }
    throw new Error('Invalid value');
}

sayHello('xx')
sayHello(['aa', 'bb'])

错误:
https://www.typescriptlang.org/play?#code/FAYw9gdgzmA2CmA6ECCGAnAFASmAMwFcIQAXAS0gAIpUBPACXlljAB4AVS+ADxPggAmUaiXRkIAc0oAfEWMkBtALoA+TBFQBbeAC5K7bHs48+g4VFHipAfjlXKei-InLKAb2CUvlMnkqYSWgAHeDA-DW1KAF4YygByJys47HdPb3T0eBICdAhKAAN6MgAaSgASNwj4AF8AQnyAbjSvaq5YKHgfP0wAQXR0OkQyKD6B2nUteGwUj3SMrJy8qsRNVCCJyKiVAqLSiqq6-Owm9OrmyhIAC3QwAHdKCHh7gFF+sCw4gEkIADdUWDIAkof1gBHgySaZ2AwBoDCYLEwcW43GSlAA9Gjgf9ATC6IxmGBMAo4qhUHFSnEAEaUuJKFIYrEAgTQoA

bjg7j2ky

bjg7j2ky1#

我不认为有一个完美的方法可以让编译器不抱怨这一点。或者,您可以使用函数重载。

function sayHello(name: string): string;
function sayHello(names: string[]): string[];
function sayHello(name: string | string[]) {
  if (typeof name === 'string') {
    return `Hi, ${name}!`;
  } else if (Array.isArray(name)) {
    return name.map((name) => `Hi, ${name}!`);
  }
  throw new Error('Invalid value');
}

const case1 = sayHello('xx');
const case2 = sayHello(['aa', 'bb']);

Playground

flseospp

flseospp2#

这是当前Typescript的一个局限性。
您可以在这里了解更多:https://github.com/microsoft/TypeScript/issues/33912

相关问题