我们如何确保类型是没有属性的超类型的成员?
目标是确保只能向方法提供共享超类型的类型,而不能提供其他类型。
假设我们有很多种要更新的东西。
type DateUpdateObj= {newDate:Date}
type LengthUpdateObj= {newLength:number, unit: 'm'|'cm'}
type ...UpdateObj = {...} //it should be possible to add many more Update Objects types
只有子类型应该被接受为函数的参数。但是你怎么能正确地做呢?
我最初的努力是利用 scaler (UpdateObj) 提供的标记接口,类似于在 Java 或 Kotlin 中看到的接口。
class UpdateObj { private readonly _ :never} // acts as a marker interface
type MyUpdateObj = { foo:string} & UpdateObj //the new update obj type
function send<T extends UpdateObj>(updateObj:T){} //the function only accepts UpdateObj
编译测试:
send("") //ok, doesn't compile as expected
send(new Date()) //ok, doesn't compile as expected
send({foo:'hurray'} as MyUpdateObj) //ok, compiles es expected
const myUpdate:MyUpdateObj= { foo:"err"} //should compile but doesn't, since '_' is missing and adding a cast is not possible in my case cause it would break source compatibility
send(myUpdate)
还有哪些其他解决方案可以解决此问题?
谢谢