有一个接口。
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
},
});
在通用类型中组合类型
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: number
或 value: string
). (实现一种类型就够了,不要两种都实现)。
当没有union的时候,TS知道它正是 BaseConfig<number | string>
和 value
是其通用的,即 number | string
.