tsx.test-d.tsx 3.4 KB

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