options-test.ts 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353
  1. import Vue, { VNode } from "../index";
  2. import { AsyncComponent, ComponentOptions, FunctionalComponentOptions, Component } from "../index";
  3. import { CreateElement } from "../vue";
  4. interface MyComponent extends Vue {
  5. a: number;
  6. }
  7. const option: ComponentOptions<MyComponent> = {
  8. data() {
  9. return {
  10. a: 123
  11. }
  12. }
  13. }
  14. // contravariant generic should use never
  15. const anotherOption: ComponentOptions<never> = option
  16. const componentType: Component = option
  17. Vue.component('sub-component', {
  18. components: {
  19. a: Vue.component(""),
  20. b: {}
  21. }
  22. });
  23. Vue.component('prop-component', {
  24. props: {
  25. size: Number,
  26. name: {
  27. type: String,
  28. default: '0',
  29. required: true,
  30. }
  31. },
  32. data() {
  33. return {
  34. fixedSize: this.size.toFixed(),
  35. capName: this.name.toUpperCase()
  36. }
  37. }
  38. });
  39. Vue.component('string-prop', {
  40. props: ['size', 'name'],
  41. data() {
  42. return {
  43. fixedSize: this.size.whatever,
  44. capName: this.name.isany
  45. }
  46. }
  47. });
  48. class User {
  49. private u = 1
  50. }
  51. class Cat {
  52. private u = 1
  53. }
  54. Vue.component('union-prop', {
  55. props: {
  56. primitive: [String, Number],
  57. object: [Cat, User],
  58. regex: RegExp,
  59. mixed: [RegExp, Array],
  60. union: [User, Number] as {new(): User | Number}[] // requires annotation
  61. },
  62. data() {
  63. this.primitive;
  64. this.object;
  65. this.union;
  66. this.regex.compile;
  67. this.mixed;
  68. return {
  69. fixedSize: this.union,
  70. }
  71. }
  72. });
  73. Vue.component('component', {
  74. data() {
  75. this.$mount
  76. this.size
  77. return {
  78. a: 1
  79. }
  80. },
  81. props: {
  82. size: Number,
  83. name: {
  84. type: String,
  85. default: '0',
  86. required: true,
  87. }
  88. },
  89. propsData: {
  90. msg: "Hello"
  91. },
  92. computed: {
  93. aDouble(): number {
  94. return this.a * 2;
  95. },
  96. aPlus: {
  97. get(): number {
  98. return this.a + 1;
  99. },
  100. set(v: number) {
  101. this.a = v - 1;
  102. },
  103. cache: false
  104. }
  105. },
  106. methods: {
  107. plus() {
  108. this.a++;
  109. this.aDouble.toFixed();
  110. this.aPlus = 1;
  111. this.size.toFixed();
  112. }
  113. },
  114. watch: {
  115. 'a': function(val: number, oldVal: number) {
  116. console.log(`new: ${val}, old: ${oldVal}`);
  117. },
  118. 'b': 'someMethod',
  119. 'c': {
  120. handler(val, oldVal) {
  121. this.a = val
  122. },
  123. deep: true
  124. }
  125. },
  126. el: "#app",
  127. template: "<div>{{ message }}</div>",
  128. render(createElement) {
  129. return createElement("div", {
  130. attrs: {
  131. id: "foo"
  132. },
  133. props: {
  134. myProp: "bar"
  135. },
  136. domProps: {
  137. innerHTML: "baz"
  138. },
  139. on: {
  140. click: new Function
  141. },
  142. nativeOn: {
  143. click: new Function
  144. },
  145. class: {
  146. foo: true,
  147. bar: false
  148. },
  149. style: {
  150. color: 'red',
  151. fontSize: '14px'
  152. },
  153. key: 'myKey',
  154. ref: 'myRef'
  155. }, [
  156. createElement(),
  157. createElement("div", "message"),
  158. createElement(Vue.component("component")),
  159. createElement({} as ComponentOptions<Vue>),
  160. createElement({
  161. functional: true,
  162. render(c: CreateElement) {
  163. return createElement()
  164. }
  165. }),
  166. createElement(() => Vue.component("component")),
  167. createElement(() => ( {} as ComponentOptions<Vue> )),
  168. createElement((resolve, reject) => {
  169. resolve({} as ComponentOptions<Vue>);
  170. reject();
  171. }),
  172. "message",
  173. [createElement("div", "message")]
  174. ]);
  175. },
  176. staticRenderFns: [],
  177. beforeCreate() {
  178. (this as any).a = 1;
  179. },
  180. created() {},
  181. beforeDestroy() {},
  182. destroyed() {},
  183. beforeMount() {},
  184. mounted() {},
  185. beforeUpdate() {},
  186. updated() {},
  187. activated() {},
  188. deactivated() {},
  189. errorCaptured(err, vm, info) {
  190. err.message
  191. vm.$emit('error')
  192. info.toUpperCase()
  193. return true
  194. },
  195. directives: {
  196. a: {
  197. bind() {},
  198. inserted() {},
  199. update() {},
  200. componentUpdated() {},
  201. unbind() {}
  202. },
  203. b(el, binding, vnode, oldVnode) {
  204. el.textContent;
  205. binding.name;
  206. binding.value;
  207. binding.oldValue;
  208. binding.expression;
  209. binding.arg;
  210. binding.modifiers["modifier"];
  211. }
  212. },
  213. components: {
  214. a: Vue.component(""),
  215. b: {} as ComponentOptions<Vue>
  216. },
  217. transitions: {},
  218. filters: {
  219. double(value: number) {
  220. return value * 2;
  221. }
  222. },
  223. parent: new Vue,
  224. mixins: [Vue.component(""), ({} as ComponentOptions<Vue>)],
  225. name: "Component",
  226. extends: {} as ComponentOptions<Vue>,
  227. delimiters: ["${", "}"]
  228. });
  229. Vue.component('provide-inject', {
  230. provide: {
  231. foo: 1
  232. },
  233. inject: {
  234. injectFoo: 'foo',
  235. injectBar: Symbol(),
  236. injectBaz: { from: 'baz' },
  237. injectQux: { default: 1 },
  238. injectQuux: { from: 'quuz', default: () => ({ value: 1 })}
  239. }
  240. })
  241. Vue.component('provide-function', {
  242. provide: () => ({
  243. foo: 1
  244. })
  245. })
  246. Vue.component('component-with-scoped-slot', {
  247. render (h) {
  248. interface ScopedSlotProps {
  249. msg: string
  250. }
  251. return h('div', [
  252. h('child', [
  253. // default scoped slot as children
  254. (props: ScopedSlotProps) => [h('span', [props.msg])]
  255. ]),
  256. h('child', {
  257. scopedSlots: {
  258. // named scoped slot as vnode data
  259. item: (props: ScopedSlotProps) => [h('span', [props.msg])]
  260. }
  261. })
  262. ])
  263. },
  264. components: {
  265. child: {
  266. render (this: Vue, h: CreateElement) {
  267. return h('div', [
  268. this.$scopedSlots['default']({ msg: 'hi' }),
  269. this.$scopedSlots['item']({ msg: 'hello' })
  270. ])
  271. }
  272. }
  273. }
  274. })
  275. Vue.component('narrow-array-of-vnode-type', {
  276. render (h): VNode {
  277. const slot = this.$scopedSlots.default({})
  278. if (typeof slot !== 'string') {
  279. const first = slot[0]
  280. if (!Array.isArray(first) && typeof first !== 'string') {
  281. return first;
  282. }
  283. }
  284. return h();
  285. }
  286. })
  287. Vue.component('functional-component', {
  288. props: ['prop'],
  289. functional: true,
  290. inject: ['foo'],
  291. render(createElement, context) {
  292. context.props;
  293. context.children;
  294. context.slots();
  295. context.data;
  296. context.parent;
  297. context.listeners.click;
  298. return createElement("div", {}, context.children);
  299. }
  300. });
  301. Vue.component('functional-component-object-inject', {
  302. functional: true,
  303. inject: {
  304. foo: 'foo',
  305. bar: Symbol(),
  306. baz: { from: 'baz' },
  307. qux: { default: 1 },
  308. quux: { from: 'quuz', default: () => ({ value: 1 })}
  309. },
  310. render(h) {
  311. return h('div')
  312. }
  313. })
  314. Vue.component('functional-component-check-optional', {
  315. functional: true
  316. })
  317. Vue.component("async-component", ((resolve, reject) => {
  318. setTimeout(() => {
  319. resolve(Vue.component("component"));
  320. }, 0);
  321. return new Promise((resolve) => {
  322. resolve({
  323. functional: true,
  324. render(h: CreateElement) { return h('div') }
  325. });
  326. })
  327. }));
  328. Vue.component('async-es-module-component', () => import('./es-module'))