// 1 怎样才能知道 s 是 _t 的其中一个,而不是任意的 string
type _t = "1" | "2";
function f(s: _t | string) {}
// 2 (已解)
type point = [number, number];
type polygon = [point, point, point, point];// 4个或4个以上,有没有灵活限制类型长度的方法
// 3 (已解)在constructor中执行了b,相当于初始化直接赋值了a=1,为什么ts说b没有初始化
class Demo_1 {
a: number;
constructor() {
this.b();
}
b() {
this.a = 1;
}
}
// 4 ts的索引类型
const p = {
name: "xxx",
age: 18
};
Object.keys(p).forEach((key) => {
console.log(p[key]);// 这样取值报错,不是索引类型应该怎么解决
});
求解惑,或者换种思路解决相同需求
第一个问题,我不是很确定你的需求。如果是要根据参数类型规定返回类型之类的,直接多写几个同名定义就可以了。像下面这样,对于参数类型符合
Temp
的 TS 会要求返回类型为true
,对不符合的字符串则要求false
。参见 Function Overloads。
第二个问题已经有了满意的答案。
第三个问题还没有结束,题主问的 “为什么” 还没人回答。TS 文档在 Classes 中的
--strictPropertyInitialization
选项 里给出的解答原文是前段大意是 因为子类可能重写掉这些方法,所以 TS 不会去分析构造函数中调用的方法初始化的属性。后段大意就是在你能确保该属性被初始化的情况下使用
!
跳过检查。为了避开提到的可能被重写的问题,建议在该方法上使用
private
关键字或其他等效方法(如果有)避免重写。不过目前 TS 并不会因此分析该方法内初始化的属性(TS 没有要特别解决的意思但已经标为设计缺陷),依然需要!
。第四个问题可见 Why doesn't Object.keys return a keyof type in TypeScript? - Stack Overflow,原因和变通方案都有回答。变通方案一般是用
as
自己标记类型。