在typescript中有没有一种方法可以定义一个除了一些东西之外可以接受任何东西的类型?
考虑一下这个片段:
type BagGuys = 'Voldemort' | 'Hitler';
type EveryoneElse = Exclude<string, BagGuys>; // this resolves to just string
function sayHi(name: EveryoneElse) {
console.log(`Hi ${name}!`);
}
sayHi('Mark'); // Ok!
sayHi('Voldemort'); // Ok too, we'd like to have an error here
I、 当然,我想用打字稿来防止我和坏人打招呼。
注意:我理解为什么Exclude
在这里不起作用,我只是用它来传达我的意图
这是一个可能的解决方案:
type BagGuys = 'Voldemort' | 'Hitler';
function sayHi<T extends string>(name: T extends BagGuys ? never : T) {
console.log(`Hi ${name}!`);
}
sayHi('Mark'); // Ok
sayHi('Voldemort'); // Argument of type 'string' is not assignable to parameter of type 'never'.
游乐场在这里。
我认为在实现否定类型之前,这是我们所能得到的最好的结果。请随意投票支持PR btw:(
注意:我是受这个类似问题的启发而提出这个问题的。
注意2:由于某种原因,如果我用sayHi<T>
而不是sayHi<T extends string>
键入函数,这将不起作用。我想这是另一天的问题。