diff --git a/src/toast/Toast.js b/src/toast/Toast.tsx
similarity index 83%
rename from src/toast/Toast.js
rename to src/toast/Toast.tsx
index 57060d1a2..963cb34ba 100644
--- a/src/toast/Toast.js
+++ b/src/toast/Toast.tsx
@@ -1,4 +1,4 @@
-import { watch, onMounted, onUnmounted } from 'vue';
+import { watch, onMounted, onUnmounted, PropType } from 'vue';
 
 // Utils
 import { createNamespace, isDef } from '../utils';
@@ -7,31 +7,37 @@ import { lockClick } from './lock-click';
 // Components
 import Icon from '../icon';
 import Popup from '../popup';
-import Loading from '../loading';
+import Loading, { LoadingType } from '../loading';
 
 const [createComponent, bem] = createNamespace('toast');
 
+export type ToastType = 'text' | 'loading' | 'success' | 'fail' | 'html';
+export type ToastPosition = 'top' | 'middle' | 'bottom';
+
 export default createComponent({
   props: {
     icon: String,
     show: Boolean,
     message: [Number, String],
-    duration: Number,
     className: null,
     iconPrefix: String,
     lockScroll: Boolean,
-    loadingType: String,
+    loadingType: String as PropType<LoadingType>,
     forbidClick: Boolean,
     overlayClass: null,
     overlayStyle: Object,
     closeOnClick: Boolean,
     closeOnClickOverlay: Boolean,
     type: {
-      type: String,
+      type: String as PropType<ToastType>,
       default: 'text',
     },
+    duration: {
+      type: Number,
+      default: 2000,
+    },
     position: {
-      type: String,
+      type: String as PropType<ToastPosition>,
       default: 'middle',
     },
     transition: {
@@ -43,7 +49,7 @@ export default createComponent({
   emits: ['update:show'],
 
   setup(props, { emit }) {
-    let timer;
+    let timer: NodeJS.Timeout;
     let clickable = false;
 
     const toggleClickable = () => {
@@ -64,7 +70,7 @@ export default createComponent({
       clearTimeout(timer);
     };
 
-    const toggle = (show) => {
+    const toggle = (show: boolean) => {
       emit('update:show', show);
     };
 
@@ -92,7 +98,7 @@ export default createComponent({
 
       if (isDef(message) && message !== '') {
         return type === 'html' ? (
-          <div class={bem('text')} innerHTML={message} />
+          <div class={bem('text')} innerHTML={String(message)} />
         ) : (
           <div class={bem('text')}>{message}</div>
         );