我想確保我強型別嵌套欄位并強制提供的型別所有鍵都以特定文本開頭。例如
type Prefix = `key_${string}`;
type Container<T extends Record<Prefix, any>> = {
data: T;
};
type ValidType = {
key_1: string;
key_2: number;
};
type InvalidType = {
key_1: string;
blah: number;
};
// This is allowed - all good.
const container: Container<ValidType> = {
data: {
key_1: 'hello',
key_2: 123,
},
};
// This is also allowed - but shouldn't be!
const container_2: Container<InvalidType> = {
data: {
key_1: 'hello',
blah: 231,
},
};
我想要的行為是每當有人試圖做Container<InvalidType>打字稿時都會出錯。
更新: 我想嘗試的另一種方法是
type DataType<T> = {
[key in keyof T]: T[key];
};
但不確定如何強制上面的鍵以“key_”開頭
uj5u.com熱心網友回復:
我們可以修改Container給它一個映射型別,我們過濾掉任何非前綴欄位。
type Container<T> = {
data: {
[K in keyof T as K extends Prefix ? K : never]: T[K]
}
};
的分配blah現在將失敗:
// This is allowed - all good.
const container: Container<ValidType> = {
data: {
key_1: 'hello',
key_2: 123,
},
};
const container_2: Container<InvalidType> = {
data: {
key_1: 'hello',
blah: 231,
// ^^^^^^^^^ Error: Type '{ key_1: string; blah: number; }' is not assignable to type '{ key_1: string; }
},
};
操場
但請注意!由于 TypeScript 的結構型別系統,大多數地方都允許使用多余的屬性。我們在這里只得到一個錯誤,因為我們直接分配了一個物件字面量。
要進行“真正的”多余屬性檢查,我們需要通過給它們一個never型別來將不需要的屬性列入黑名單。
type Container<T> = {
data: {
[K in keyof T as K extends Prefix ? K : never]: T[K]
} & {
[K in keyof T as K extends Prefix ? never : K]?: never
}
};
現在這也將失敗:
const container_3 = {
data: {
key_1: 'hello',
blah: 123,
},
};
const container_4: Container<InvalidType> = container_3
操場
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/533012.html
標籤:打字稿细绳仿制药类型钥匙
