我知道类型联盟&类型脚本中的类型交集,但我找不到使用类型排除的语法或解决方法。有没有办法做到这一点?
type ValidIndices = string ^ '_reservedProperty'; // All strings but '_reservedProperty'
interface MyInterface {
[property: ValidIndices]: number;
_reservedProperty: any;
}
答案 0 :(得分:1)
这不是一个完整的答案。但是如果你想为contsructor params设置排除,你可以使用这样的代码:
declare type Params<T, K extends keyof T = never, D extends keyof T = never> = (
{[P in K]: T[P]} &
{[P in keyof T]?: T[P]} &
{[P in D]?: undefined }
)
...
class Control{
prop1: number
prop2: number
prop3: number
prop4: number
constructor(params: Params<Control, 'prop1' | 'prop2', 'prop4'>){
Object.assign(this, params)
...
你得到:
params: {
prop1: number
prop2: number
prop3?: number
prop4?: undefined
}
答案 1 :(得分:0)
如果有一组有限的字符串值是允许的,那么你可以使用字符串文字在类型中定义它们
type ValidIndices = "a" | "b" | "c" ...
但是,我不认为您正在寻找的功能现在作为类型定义的一部分存在。
您当然可以通过MyInterface
实现中的代码来实现此目的,以确保不使用非法值。但你不能把它作为类型定义本身的一部分(除了你可能不想要的字符串文字)。