我可以设置类型参数的可能类型吗?

时间:2019-11-26 17:49:43

标签: typescript

让我们看看我想构建一个函数:

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; 可以是什么,在这种情况下为TA

有可能吗?

3 个答案:

答案 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不受约束为ABT也可以是PossibleObjects本身。我认为没有办法禁止这种情况,但是您应该意识到这一点。