在表單設計中經常會使用 user 輸入的值或行為做判斷,例如 input text 的 keyup ,當使用者 key 完放開鍵盤的瞬間觸發該事件,那要怎麼接受到每一次敲打鍵盤傳來的值呢?簡單的範例如下
使用版本:Angular 12.1.1
component.html
<header class="header">
<h1>todos</h1>
<input
class="new-todo"
placeholder="What needs to be done?"
autoFocus
[value]="text"
(keyup)="changeText($event)"
(keyup.enter)="addTodo()"
/>
</header>
(keyup) 是 Angular 事件繫結(event binding)的語法,用括弧包起來,透過 $event 物件作為引數傳給 changeText() 方法。
component.ts
import { Component } from "@angular/core";
@Component({
selector: 'app-todos-header',
templateUrl: './header.component.html',
})
export class HeaderCompnent {
text: string ='';
changeText(event: Event): void{
console.log(event.target.value);
}
addTodo(): void {
console.log('addTodo',this.text);
}
}
Table of Contents
出現 value 不屬於 EventTarget 的錯誤

因為 $event 上述的例子皆屬於 HTMLElement,可以代表任何一個 HTML 元素,表示不一定存在於 $event.target。
解法一:event interface 改為 any 或不加
不推薦的解法,只是讓他跟沒有強型別一樣。
changeText(event:any): void{
console.log(event.target.value);
}
解法二:用 as keyword 把 event.target 轉型為 HTMLInputElement
型別斷言(Type Assertion),用 as 關鍵字指定一個型別。
event.target as HTMLInputElement; => 指定為 HTMLInputElement 型別。
changeText(event: Event): void{
const target = event.target as HTMLInputElement;
console.log(target.value);
}
解法三:用泛型(Generics),<HTMLInputElement>
其實跟二應該差不多,一樣可解決
changeText(event: Event): void{
const target = <HTMLInputElement>event.target
this.text = target.value;
console.log(target.value);
}
上述兩項目的都是要讓 Typescript 知道傳進來的 type 是什麼。



![[HackerRank][C#] Compare the Triplets 比較三胞胎 Solution](https://i0.wp.com/shihminnotes.com/wp-content/uploads/2022/03/compare-the-triplets-scaled.jpg?fit=1024%2C683&ssl=1)