tsx.test-d.tsx 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. // TSX w/ defineComponent is tested in defineComponent.test-d.tsx
  2. import { Fragment, KeepAlive, Suspense, Teleport, type VNode } from 'vue'
  3. import { expectType } from './utils'
  4. expectType<VNode>(<div />)
  5. expectType<JSX.Element>(<div />)
  6. expectType<JSX.Element>(<div id="foo" />)
  7. expectType<JSX.Element>(<div>hello</div>)
  8. expectType<JSX.Element>(<input value="foo" />)
  9. expectType<JSX.Element>(<textarea value={null} />)
  10. // @ts-expect-error style css property validation
  11. ;<div style={{ unknown: 123 }} />
  12. // allow array styles and nested array styles
  13. expectType<JSX.Element>(<div style={[{ color: 'red' }]} />)
  14. expectType<JSX.Element>(
  15. <div style={[{ color: 'red' }, [{ fontSize: '1em' }]]} />,
  16. )
  17. // allow undefined, string, object, array and nested array classes
  18. expectType<JSX.Element>(<div class={undefined} />)
  19. expectType<JSX.Element>(<div class={'foo'} />)
  20. expectType<JSX.Element>(<div class={['foo', undefined, 'bar']} />)
  21. expectType<JSX.Element>(<div class={[]} />)
  22. expectType<JSX.Element>(<div class={['foo', ['bar'], [['baz']]]} />)
  23. expectType<JSX.Element>(<div class={{ foo: true, bar: false, baz: true }} />)
  24. expectType<JSX.Element>(<div class={{}} />)
  25. expectType<JSX.Element>(
  26. <div class={['foo', ['bar'], { baz: true }, [{ qux: true }]]} />,
  27. )
  28. expectType<JSX.Element>(
  29. <div
  30. class={[
  31. { foo: false },
  32. { bar: 0 },
  33. { baz: -0 },
  34. { qux: '' },
  35. { quux: null },
  36. { corge: undefined },
  37. { grault: NaN },
  38. ]}
  39. />,
  40. )
  41. expectType<JSX.Element>(
  42. <div
  43. class={[
  44. { foo: true },
  45. { bar: 'not-empty' },
  46. { baz: 1 },
  47. { qux: {} },
  48. { quux: [] },
  49. ]}
  50. />,
  51. )
  52. // #7955
  53. expectType<JSX.Element>(<div style={[undefined, '', null, false]} />)
  54. expectType<JSX.Element>(<div style={undefined} />)
  55. expectType<JSX.Element>(<div style={null} />)
  56. expectType<JSX.Element>(<div style={''} />)
  57. expectType<JSX.Element>(<div style={false} />)
  58. // @ts-expect-error
  59. ;<div style={[0]} />
  60. // @ts-expect-error
  61. ;<div style={0} />
  62. // @ts-expect-error unknown prop
  63. ;<div foo="bar" />
  64. // allow key/ref on arbitrary element
  65. expectType<JSX.Element>(<div key="foo" />)
  66. expectType<JSX.Element>(<div ref="bar" />)
  67. expectType<JSX.Element>(
  68. <input
  69. onInput={e => {
  70. // infer correct event type
  71. expectType<EventTarget | null>(e.target)
  72. }}
  73. />,
  74. )
  75. // built-in types
  76. expectType<JSX.Element>(<Fragment />)
  77. expectType<JSX.Element>(<Fragment key="1" />)
  78. expectType<JSX.Element>(<Teleport to="#foo" />)
  79. expectType<JSX.Element>(<Teleport to="#foo" key="1" />)
  80. // @ts-expect-error
  81. ;<Teleport />
  82. // @ts-expect-error
  83. ;<Teleport to={1} />
  84. // KeepAlive
  85. expectType<JSX.Element>(<KeepAlive include="foo" exclude={['a']} />)
  86. expectType<JSX.Element>(<KeepAlive key="1" />)
  87. // @ts-expect-error
  88. ;<KeepAlive include={123} />
  89. // Suspense
  90. expectType<JSX.Element>(<Suspense />)
  91. expectType<JSX.Element>(<Suspense key="1" />)
  92. expectType<JSX.Element>(
  93. <Suspense onResolve={() => {}} onFallback={() => {}} onPending={() => {}} />,
  94. )
  95. // @ts-expect-error
  96. ;<Suspense onResolve={123} />
  97. // svg
  98. expectType<JSX.Element>(
  99. <svg
  100. xmlnsXlink="http://www.w3.org/1999/xlink"
  101. xmlns="http://www.w3.org/2000/svg"
  102. />,
  103. )
  104. // details
  105. expectType<JSX.Element>(<details name="details" />)