我有一個看起來像這樣的東西。
export enum TableCellType {
Index = 'index',
Text = 'text',
Template = 'template',
}
export interface TableCell {
class?: string;
}
我希望TableCell介面使列舉中的值之一成為必需的值,但如果一個值在物件上,則禁止其他值。
例子:
let a = {index: 2, text: 'hello'}
這是不行的,因為列舉中的兩個值在物件上。在任何給定時間只能存在一個。
let b = {text: 'This works'}
這是可以的,因為列舉中沒有多個。
我如何進行打字提示以便打字稿理解?
謝謝。
uj5u.com熱心網友回復:
你可以讓它用于物件文字(另外,我指定了由 TableCellType 定義的屬性的型別):
export enum TableCellType {
Index = 'index',
Text = 'text',
Template = 'template',
}
type OneOfTableCellTypes = {index: number; text?: never; template?: never}
| {index?: never; text: string; template?: never}
| {index?: never; text?: never; template: string}
export type TableCell = OneOfTableCellTypes & {
class?: string;
}
let a: TableCell = {index: 2, text: 'hello'} // ERROR
let b: TableCell = {index: 2} // OK
操場
如果您有更多變體,則可以使用:
type TableCellTypeMap = {
index: number;
text: string;
template: string,
}
type ExcludeAllExcept<T, K extends keyof T> = {[Prop in keyof T]?: Prop extends K ? T[Prop]: never}
type oneOf<T> = { [K in keyof T]: Pick<T, K> & ExcludeAllExcept<T, K>}[keyof T];
export type TableCell = oneOf<TableCellTypeMap> & {
class?: string;
}
let a: TableCell = {index: 2, text: 'hello'} // ERROR
let b: TableCell = {index: 2} // OK
與 oneOf 的游樂場
不幸的是,這不會阻止您在運行時分配不正確的物件(具有 2 個屬性)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/390803.html
標籤:打字稿
上一篇:創建一個接受泛型類建構式的函式
