我有這樣的方法
square(num: number | string): number {
//
}
在這種方法中,我想檢查引數的資料型別并相應地呼叫邏輯。在 TS 中如何做到這一點?
編輯:
有問題的特定型別
export type KV<T extends string | number> = {
key: string;
val: T;
}
export type LogicalKV<T extends string | number> = {
logicalOperator: LogicalOperator
filters?: Filter<T>[];
logicalFilters?: LogicalFilter<T>[];
}
功能
class Foo {
read(filter: KV<string | number> | LogicalKV <string | number>): Promise<void> {
// if filter is of KV do this, else do that
}
}
uj5u.com熱心網友回復:
不幸的是,型別在運行時被剝離。但你可以走老路typeof
if (typeof num === "string") {/*it's string here*/} else {/*it's number here*/}
Typescript 也會理解這一點,并在每個分支中強制使用適當的型別。
對于像您這樣的自定義型別,情況會有所不同。涉及代數資料型別。當你實體化它時它也不太漂亮,但你必須以一種或另一種方式處理傳遞運行時字串“種類”。
export type KV = {
kvField: string;
kind: "kv";
};
export type LogicalKV = {
logicalKvField: number;
kind: "logicalKv";
};
const KVInstance: KV = {
kind: "kv",
kvField: "foo"
};
const LogicalKVInstance: LogicalKV = {
kind: "logicalKv",
logicalKvField: 1
};
type FilterArg = KV | LogicalKV;
const fn = (f: FilterArg) => {
switch (f.kind) {
case "kv":
// ts knows it's KV
f.kvField;
return;
case "logicalKv":
// ts knows it's LogicalKV
f.logicalKvField;
return;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/479138.html
標籤:javascript 打字稿
上一篇:使用lodash合并兩個物件陣列
下一篇:具有通用函式的打字稿回呼
