接口方法的通用参数

问题描述 投票:0回答:1

有一个接口。

interface BaseConfig<T = number> {
  doSomething(value: T): void;
}

有一个函数在参数处接受这个接口。

function test(config: BaseConfig<number> | BaseConfig<string>) {}

问题: 问题: value 有吗?我希望它是 string | number.

test({
  doSomething(value) {} // <-- value is any
});

链接到游乐场

注意:如果不在参数处使用generic,而是在响应处使用generic--一切正常。

interface BaseConfig<T = number> {
  doSomething(): T;
}

function test(config: BaseConfig<number> | BaseConfig<string>) {}

test({
  doSomething() {
    return 1; // exepct to return only number ot string
  },
});

链接到游乐场

typescript generics types
1个回答
1
投票

在通用类型中组合类型

function test(config: BaseConfig<number | string>) {}

问题 BaseConfig<number> | BaseConfig<string> 是TS在联合的情况下不会将相似的类型合并,理解为 A | B.

这意味着 config 可以是 BaseConfig<number>BaseConfig<string> 而当你宣布 doSomething(value) {} 类型稿不知道是否是 BaseConfig<number>BaseConfig<string> 并由您来提供类型(只需添加 value: numbervalue: string). (实现一种类型就够了,不要两种都实现)。

当没有union的时候,TS知道它正是 BaseConfig<number | string>value 是其通用的,即 number | string.

© www.soinside.com 2019 - 2024. All rights reserved.