【问题标题】:Typescript, restrain the second parameter to depend on first parameter type打字稿,限制第二个参数依赖于第一个参数类型
【发布时间】:2018-04-06 20:10:29
【问题描述】:

我有 2 个对象类型:TypeA 和 TypeB 我想定义一个获取两个参数的函数。 如果第一个参数是 TypeA 类型,那么第二个参数只能取值 'a' 或 'b' 但是如果第一个参数是 TypeB 类型,那么第二个参数只能取值 'c' 或 'd'

const A:TypeA =...
const B: TypeB =...

myfunct(A,'a') fine
myfunct(B,'c') fine
myfunct(A,'c') not fine

谢谢

【问题讨论】:

标签: typescript


【解决方案1】:

应该这样做:

interface TypeA { prop1: string }
interface TypeB { prop2: string }
type SmallA = 'a' | 'b';
type SmallB = 'c' | 'd';
interface MixedA {
    prop1: TypeA;
    prop2: SmallA;
}
interface MixedB {
    prop1: TypeB;
    prop2: SmallB;
}

function myFunc(param: MixedA | MixedB) { }

const A: TypeA = { prop1: "w" };
const B: TypeB = { prop2: "w" };

myFunc({ prop1: A, prop2: 'b' })

希望对您有所帮助。

【讨论】:

  • 对不起,但 myFunc({prop1: A, prop2: 'd'}) 有效,所以这不是答案
  • 发生这种情况是因为 TypeA 和 TypeB 接口是空的并且它们是匹配的。我已经更新了答案以反映这一点。
【解决方案2】:

使用重载,您可以这样做:

class TypeA { prop1: string };
class TypeB { prop2: string };

type ab = 'a' | 'b';
type cd = 'c' | 'd';

function func(p1: TypeA, p2: ab): void;
function func(p1: TypeB, p2: cd): void;
function func(p1, p2): void {
    console.log(p1, p2);
}

const ta = new TypeA();
const tb = new TypeB();

func(ta, 'a'); // OK
func(ta, 'b'); // OK
func(tb, 'a'); // NO OK
func(tb, 'c'); // OK
func(ta, 'c'); // NO OK

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-13
    • 2021-11-11
    • 1970-01-01
    • 2021-11-26
    • 2021-11-20
    • 2022-01-26
    • 2018-03-22
    • 1970-01-01
    相关资源
    最近更新 更多