让我们看看我想构建一个函数:
Message
即使此功能没什么用,但最好解释一下我想要的。我想控制type A = {
foo: boolean
};
type B = {
bar: boolean
}
type PossibleObjects = A | B
type Object <T> = {
[key in keyof T]?: boolean
}
const fn = <
T //:PossibleObjects
>(object: Object<T>) => object;
可以是什么,在这种情况下为T
或A
。
有可能吗?
答案 0 :(得分:1)
您可以通过缩小通用类型T
来扩展可能的对象来实现。
type A = { foo: boolean };
type B = { bar: boolean };
type PossibleObjects = A | B
type SomeObject <T> = { // Renamed to "SomeObject" since "Object" is already a default type
[key in keyof T]?: boolean
}
const fn = <T extends PossibleObjects> // This makes T a subtype of PossibleObjects
(object: SomeObject<T>) => object;
fn({ foo: true }); // Works
fn({ bar: true }); // Works
fn({ baz: true }); // Error: Argument of type '{ baz: boolean; }' is not assignable to parameter of type 'SomeObject<A> | SomeObject<B>'.
如果您的SomeObject
类型只能(而不仅仅在fn
函数中)指定PossibleObjects
类型的键,那么您可能想在{{ 1}}类型。
SomeObject
答案 1 :(得分:0)
使用管道(|)运算符提供不同的类型:
function fn(arg: A | B): any {
// code
}
答案 2 :(得分:0)
关键字extends
设置类型参数的上限。这适用于类型声明和函数声明。
type SomeObject<T extends PossibleObjects> = {
[key in keyof T]?: boolean
}
const fn = <T extends PossibleObjects>(obj: SomeObject<T>) => obj;
请注意,此处的T
不受约束为A
或B
; T
也可以是PossibleObjects
本身。我认为没有办法禁止这种情况,但是您应该意识到这一点。