我是 TypeScript 的新手,但很喜歡它!
在 JavaScript 中,如果我想檢查一個物件是否有一個函式并呼叫它,我可以這樣做:
if(this['my_func']) {
this['my_func']();
}
在 TypeScript 中,它似乎不是這樣作業的,因為要使該代碼有效,my_func必須宣告。就我而言,my_func可能不會被宣告。具體來說,一個子類可以選擇是否宣告/定義它,我希望它只有在定義時才被呼叫。
我知道我可以添加@ts-ignore,但我希望有更好(正確)的方法。
有沒有辦法說一個物件可能包含非顯式宣告?
這是我的完整代碼:
import {LitElement} from 'lit';
export type AnyConstructor<T = object> = new(...args: any[]) => T;
type EventType = keyof HTMLElementEventMap;
type EventValue = ValueOf<HTMLElementEventMap>;
export abstract class EventClass extends LitElement {
}
export const EventMixin = <T extends AnyConstructor<EventClass>>(
events: EventType[],
superClass: T
): T & AnyConstructor<EventClass> => {
class Event_ extends superClass {
public override connectedCallback(): void {
super.connectedCallback();
events.forEach((event: EventType) => {
const listener: any = this[`_${event}`];
if(listener) {
this.addEventListener(event, (event: EventValue) => listener(event));
}
});
}
}
return Event_;
};
目標是允許子類定義諸如 之類的函式_onClick(event: MouseEvent),這些函式在元素連接時注冊為偵聽器。這可能不是一個好主意,我知道。我只是在玩弄 TypeScript,并且樂于接受反饋/建議!
uj5u.com熱心網友回復:
正確的方法是使用型別保護/型別謂詞:
type MethodNamed<Key extends string> = { [K in Key]: Function };
function hasMethod<T, K extends string>(obj: T, methodName: K): obj is T & MethodNamed<K> {
return obj != null && typeof obj === 'object' && typeof (obj as any)[methodName] === 'function';
}
用法示例:
declare const foo: unknown;
if (hasMethod(foo, 'cool')) {
foo.cool(1, 2, 3);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/382649.html
標籤:打字稿
