使用 TypeScript,我想創建一個不同泛型的陣列。
我的泛型類的目標是表示表列,并且 T 保存該列將保存的值的型別。這看起來如下:
export class TableColumnConfig<T> { ... }
當我想將一個表的多個列放入陣列時,我這樣做:
const columns: TableColumnConfig<any>[] = [];
然后我會做這樣的事情:
columns.push(new TableColumnConfig<number>());
columns.push(new TableColumnConfig<string>());
這行得通,但問題是 eslint 告訴我我不應該使用任何
出乎意料。指定不同的 type.eslint@typescript-eslint/no-explicit-any
Eslint 建議使用未知。
所以我這樣做:
const columns: TableColumnConfig<unknown>[] = [];
所以當然,我收到以下錯誤:
'TableColumnConfig<number>' 型別的引數不可分配給'TableColumnConfig<unknown>' 型別的引數。型別“未知”不可分配給型別“數字”.ts(2345)
有什么方法可以滿足 eslint 并且不會出現打字稿語法錯誤?
在這種情況下可以忽略 eslint 的警告嗎?
非常感謝一些建議!:)
編輯:這就是我的班級和我使用的構建器的樣子:
export class TableColumnConfig<T> {
// lots of properties (that don't use T)
format?: (val: T) => string;
sort?: (val1: T, val2: T) => number;
constructor() {
// ...
}
}
export class TableColumnConfigBuilder<T> implements ITableColumnConfigBuilder<T> {
private tableColumnConfig: TableColumnConfig<T>;
constructor() /* some mandatory properties */
{
this.tableColumnConfig = new TableColumnConfig(
sourceAddress,
parameterAddress,
dataType,
mainLabel
);
}
// ...
setFormat(format: (val: T) => string): this {
this.tableColumnConfig.format = format;
return this;
}
setSort(sort: (val1: T, val2: T) => number): this {
this.tableColumnConfig.sort = sort;
return this;
}
get(): TableColumnConfig<T> {
return this.tableColumnConfig;
}
}
interface ITableColumnConfigBuilder<T> {
// ...
setFormat(format: (val: T) => string): this;
setSort(sort: (val1: T, val2: T) => number): this;
}
uj5u.com熱心網友回復:
您在此處看到的錯誤與方差有關。這兩個函式在逆變format位置中sort使用,使型別逆變,從而反轉可分配性。您還可以在協變位置具有其他屬性,從而使型別最終保持不變。TTableColumnConfig TableColumnConfig
您可以通過使用方法而不是包含函式的屬性來繞過錯誤。正如我今天了解到的,方法也可以是可選的。
export class TableColumnConfig<T> {
format?(val: T): string
sort?(val1: T, val2: T): number
constructor() {}
}
const columns: TableColumnConfig<unknown>[] = [];
// this works fine now
columns.push(new TableColumnConfig<number>());
columns.push(new TableColumnConfig<string>());
這是有效的,因為方差對方法的作業方式不同。見這里。
方法型別與它們的引數型別共同變化和反向變化
操場
uj5u.com熱心網友回復:
您可以使型別columns精確反映它包含的列的型別:
const columns: (TableColumnConfig<number> | TableColumnConfig<string>)[] = [];
// ?????????????^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
游樂場鏈接
columns請注意,如果您使用文字定義并且不提供顯式型別,TypeScript 將為您執行此操作:
const columns = [
new TableColumnConfig<number>(),
new TableColumnConfig<string>(),
];
游樂場鏈接
當然,這并不總是可能的。
但是,如果您不想精確地確定型別,那么any您可以去那里。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/519885.html
標籤:打字稿仿制药埃斯林特
上一篇:Swift-注入和存盤協議
