Guest User

Untitled

a guest
Jan 18th, 2018
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.07 KB | None | 0 0
  1. interface WithNumber {
  2. foo: number;
  3. }
  4.  
  5. interface WithString {
  6. bar: string;
  7. }
  8.  
  9. type MyType = WithNumber | WithString;
  10.  
  11. interface Container<T extends MyType = MyType> {
  12. content: {
  13. value: T
  14. }
  15. }
  16.  
  17. interface WithNumberContainer extends Container<WithNumber> { };
  18. interface WithStringContainer extends Container<WithString> { };
  19.  
  20. type MysteryContainer = WithNumberContainer | WithStringContainer;
  21.  
  22. interface ParameterWithContainer<C extends MysteryContainer = MysteryContainer> {
  23. container: C
  24. }
  25.  
  26. function isParameterWithNumberContainer(arg: ParameterWithContainer<MysteryContainer>): arg is ParameterWithContainer<WithNumberContainer> {
  27. return typeof (arg.container.content.value as WithNumber).foo === "number";
  28. }
  29.  
  30. function test(arg: ParameterWithContainer<WithNumberContainer | WithStringContainer>) {
  31. if (isParameterWithNumberContainer(arg)) {
  32. arg.container.content.value.foo;
  33. return;
  34. }
  35. /*
  36. * Error:
  37. * Property 'bar' does not exist on type 'MyType'.
  38. * Property 'bar' does not exist on type 'WithNumber'.
  39. */
  40. arg.container.content.value.bar;
  41. }
Add Comment
Please, Sign In to add comment