Typescript:如何在提供默认值时从返回类型中删除undefined

aelbi1ox  于 2023-02-05  发布在  TypeScript
关注(0)|答案(2)|浏览(270)
class MyStore {
    data: Record<string, string> = {};
    getKey(key: string, defaultValue?: string): string | undefined {
        return this.data[key] ?? defaultValue;
    }
}

const store = new MyStore();

const value1 = store.getKey("test");
const value2 = store.getKey("test", "def");

1.现在value1的类型是string | undefined,是对的,没有问题。
1.但是value2也有相同类型的value1。如何更新getKey()的签名,以便在提供默认值时,没有undefined。就像value2应该只有string类型。

eh57zj3b

eh57zj3b1#

最简单的方法(这也很好地发挥了智能感知)是函数重载:

class MyStore {
  data: Record<string, string> = {};
  getKey(key: string): string | undefined // callable signature
  getKey(key: string, defaultValue: string): string // callable signature
  getKey(key: string, defaultValue?: string): 
      string | undefined { //implementation signature
    return this.data[key] ?? defaultValue;
  }
}

Playground链接
你也可以用泛型和条件类型来解决这个问题,这是一个可读性相当低的解决方案:

class MyStore {
  data: Record<string, string> = {};
  getKey<T extends string | undefined>(key: string, defaultValue?: T): 
      T extends string ? string : string | undefined {
    return this.data[key] ?? defaultValue;
  }
}

Playground链接

5rgfhyps

5rgfhyps2#

使用泛型应该可以,但是你的返回值不应该包含字符串。因为,你的Record的值是any类型。

getKey<T = undefined>(key: string, defaultValue?: T): string | T {
        return this.data[key] ?? defaultValue;
}

如果您打算只使用字符串作为值,我建议更新记录的类型。

data: Record<string, string> = {};

相关问题